Compose 组件化路由框架 KRouter

572 阅读1分钟

Compose 组件化路由框架 KRouter

最近一直在使用Compose开发新页面,每次注册一个新页面都得写一套模版代码,然后传输数据也很麻烦,虽然之前也写了一些框架(比如ComposeSafeArgs)来简化这部分的代码,但是在组件化使用起来还是有点繁琐,后面参考了一下ARouter的做法,重新设计了一个简单注册,和方便传输数据的框架KRouter(github地址)

使用方式 (last_version = "1.0.5")

1、添加依赖

root build.gradle

dependencies {
    classpath  "io.github.ckenergy:KRoutePlugin:$KRouter_version"
}

app build.gradle


plugins {
    id 'KRoute-plugin'
}

implementation("io.github.ckenergy:kRouter-core:$KRouter_version")

使用到@KRouter注解的module build.gradle

ksp {
    arg("KROUTER_PACKAGE", "you module namespace")
}
ksp("io.github.ckenergy:kRouter-compiler:$KRouter_version")

2、给一个页面加上@KRouter注册路由(就无需再NavHost给每个页面注册路由了)

@KRouter(ComposeRouterMapper.Second)
@Composable
fun SecondPage(int: Int, string: String? = "default", testBean: TestBean, vararg long: Long)
注意:函数上的参数只能放简单的数据(基本类型和bean之类的,因为这块用的是Gson来序列化的)

上面的代码等于原始注册路由的方式

NavHost() {
    composable(ComposeRouterMapper.Second) {
        //... 获取参数
        SecondPage(....)
    }
}

3、在NavHost初始化

NavHost() {
    NavGraphManager.initKRouter(context, this, navController) {
        notFindPage = { route: String -> NotFindPage(route) }
    }
}

4、跳转的时候带上参数就可以啦

controller.navigateRoute(ComposeRouterMapper.Second) {
    put("int", 1)//key的名字要和SecondPage函数参数名要保持一致一一对应
    put("long", longArrayOf(1L, 3L))
    put("testBean", TestBean(1.5f, false))
}