xiaojinzi123 / KComponent

A powerful componentized framework.一个强大、100% 兼容、支持 AndroidX、支持纯 Kotlin并且灵活的组件化框架
Apache License 2.0
145 stars 12 forks source link

配置了多模块,用了ksp,那个自动生成的代码,会自动消失 #12

Open molast opened 3 weeks ago

molast commented 3 weeks ago

用了ksp,那个自动生成的代码,会自动消失 ksp { arg("ModuleName", project.name) } 每个模块都用了这个,然后初始化: Component.init( application = BaseApplication.app, isDebug = BuildConfig.DEBUG, config = Config.Builder() .optimizeInit(isOptimizeInit = true) .autoRegisterModule(isAutoRegisterModule = true) .build() ) 最开始尝试自动手动注册,失败,现在改成这个自动注册,还是一样,这里自动注册,那个classpath配置过插件。就是那个生成的com.xiaojinzi.component.impl这个override fun initRouterList(): List {这里面,第一次有内容,然后再启动一次,里面的东西就没了,真是神奇的代码,然后淡然,从第一次那个路由就没成功跳转过,我是从launch页使用Router的forward想跳转login页面,login用@RouterAnno(hostAndPath = RouterConstant.Login.PATH_PHONE_LOGIN)注解过的。 所以这个框架到底是不是成熟的。我是看这个支持ksp跑来改成这个,结果,蚌埠住了

xiaojinzi123 commented 3 weeks ago

禁用 ksp 增量更新应该就好了

xiaojinzi123 commented 3 weeks ago

而且遇事别紧张. 我会给你解决的

molast commented 3 weeks ago

这个自动生成确实是可以解决,但是路由跳转仍然是没有用,override fun initRouterList(): List { val defaultScheme = Component.requiredConfig().defaultScheme return listOf( RouterBean( regex = "", uri = defaultScheme + "://login/phone", desc = "", pageInterceptors = listOf(), targetClass = com.molast.login.ui.LoginActivity::class, ), RouterBean( regex = "", uri = defaultScheme + "://login/auth", desc = "", pageInterceptors = listOf(), targetClass = com.molast.login.ui.LoginAuthActivity::class, ), RouterBean( regex = "", uri = defaultScheme + "://login/perfect_user", desc = "", pageInterceptors = listOf(), targetClass = com.molast.login.ui.PerfectUserInfoActivity::class, ) ) } 这里的login/phone明明是存在,但是就是报错:route fail:router://login/phone and errorClass is JobCancellationException,errorMsg is 'Job was cancelled',我看了下这个生成的类,里面有个

com.xiaojinzi.component.`impl`

这里的impl是kotlin的关键字,你这里写在了包名里面,所以这里被打了转义,我不知道会不会跟这个有关系

xiaojinzi123 commented 3 weeks ago
  1. 你看下是不是 App 模块中有没有依赖对应模块的 Module
  2. 如果依赖了, 你看下 App 模块中的 Gradle 插件是不是没有配置, 因为自动加载需要 Gradle 插件的配合, 比较简单的方式就是:打印下 ASMUtil 中的 moduleNameList, 看下是否有数据
xiaojinzi123 commented 3 weeks ago

这个自动生成确实是可以解决,但是路由跳转仍然是没有用,override fun initRouterList(): List { val defaultScheme = Component.requiredConfig().defaultScheme return listOf( RouterBean( regex = "", uri = defaultScheme + "://login/phone", desc = "", pageInterceptors = listOf(), targetClass = com.molast.login.ui.LoginActivity::class, ), RouterBean( regex = "", uri = defaultScheme + "://login/auth", desc = "", pageInterceptors = listOf(), targetClass = com.molast.login.ui.LoginAuthActivity::class, ), RouterBean( regex = "", uri = defaultScheme + "://login/perfect_user", desc = "", pageInterceptors = listOf(), targetClass = com.molast.login.ui.PerfectUserInfoActivity::class, ) ) } 这里的login/phone明明是存在,但是就是报错:route fail:router://login/phone and errorClass is JobCancellationException,errorMsg is 'Job was cancelled',我看了下这个生成的类,里面有个

com.xiaojinzi.component.`impl`

这里的impl是kotlin的关键字,你这里写在了包名里面,所以这里被打了转义,我不知道会不会跟这个有关系

然后看你这个错误, 你应该是在 forword 跳转之后立马 finish 了界面. 这个在 Component 中是不被允许的. 你需要在回调中 finish

molast commented 3 weeks ago

我就知道你会问这个依赖问题,我是从ARouter转过来的,app是已经依赖了所有的模块的,然后app模块下的插件是:plugins { id 'com.android.application' id 'com.xiaojinzi.kcomponent.plugin' id 'org.jetbrains.kotlin.android' id 'kotlin-parcelize' id 'kotlin-kapt' id("com.google.devtools.ksp")

id 'com.google.firebase.firebase-perf'
id 'com.google.firebase.crashlytics'
id 'com.google.gms.google-services'

} 单后打印的是:

                *********
             ****        ****
          ****              ****
        ****
       ****
       ****
       ****
        ****
          ****              ****
             ****        ****
                *********
   感谢您选择 KComponent 组件化框架. 
   有任何问题欢迎提 issue 或者扫描 github 上的二维码进入群聊@群主
   Github 地址:https://github.com/xiaojinzi123/KComponent 
  文档地址:https://github.com/xiaojinzi123/KComponent/wiki 
"Bs_message" will try to load by bytecode
"Bs_contacts" will try to load by bytecode
"App" will try to load by bytecode
"Lib_search" will try to load by bytecode
"Lib_scan" will try to load by bytecode
"Bs_login" will try to load by bytecode
"Lib_common" will try to load by bytecode
"Bs_mine" will try to load by bytecode
"Base" will try to load by bytecode
The module "bs_message" is ready to register
The module "bs_contacts" is ready to register
The module "app" is ready to register
The module "lib_search" is ready to register
The module "lib_scan" is ready to register
The module "bs_login" is ready to register
The module "lib_common" is ready to register
The module "bs_mine" is ready to register
The module "base" is ready to register

这应该是都注册进去了吧。 然后你最后一个回答,解决了我的问题(尬笑一下),我想问这个问题,你在文档里有没有明确一下啊,还是我没看到

molast commented 3 weeks ago

forward的时候不能finish,这么重要的一个注意点,你居然不用大字标注一下,估计很多人会被坑

xiaojinzi123 commented 3 weeks ago

主要是大家都习惯了 Arouter 给你提供的比较不合理的 Api Arouter 是默认用 application context 跳转的. 所以和当前 Activity Context 并不会有关系. 但是这个并不是系统推荐的跳转方式, Component 一直依赖都是尽量贴近系统的设计的. 所以路由这件事从以前的 主线程直接 start, 到现在的整体异步的过程. 如果用当前的 Activity Context 就是需要在回调中处理的. 我理解你, 只不过一开始你没选择 Component 不过现在也不迟, 你会越来越喜欢的. 尽情享用 哈哈哈

molast commented 3 weeks ago

我也是最近在firebase上总是看到因为Arouter启动导致ANR的问题,才想到能不能找一个替换ARouter的路由,才看到这个,还有以前ARouter不支持launcher也很困扰,这里也能解决这个问题,虽然没看到launcher的影子,不过这次多亏作者不急不躁帮我解决这个问题,thank you

xiaojinzi123 commented 3 weeks ago

launcher 是什么功能. 你可以有空具体说明下, 说不定我可以给你提供方案或者 Api

molast commented 3 weeks ago

launcher是android 好久的功能了,以前都是通过activityforresult,现在是ActivityResultLauncher来调用,跟你这个回调很像

xiaojinzi123 commented 3 weeks ago

launcher是android 好久的功能了,以前都是通过activityforresult,现在是ActivityResultLauncher来调用,跟你这个回调很像

你说 ActivityResult 的那个 launcher 呀. 那个本来就是为了更方便以前的获取 ActivityResult 的方式. 虽然 onActiivtyResut 方法被废弃了. 但实际上只是想引导你用 launcher, 实际不会真的删除的. 因为系统底层设计上是不会改的.

Component 获取 ActivityResult 的方式也是优化了原有的. 所以放心用. 而且比 launcher 的方式更好用. 你有空可以试试

xuexixuexijpg commented 1 week ago

禁用 ksp 增量更新应该就好了

有其他库用到了ksp的增量更新,直接禁用掉直接会导致速度变慢?感觉KComponent要做增量更新的话可以参考下货拉拉的那个路由库?不知道货拉拉的ksp有没有做增量更新

xiaojinzi123 commented 1 week ago

禁用 ksp 增量更新应该就好了

有其他库用到了ksp的增量更新,直接禁用掉直接会导致速度变慢?感觉KComponent要做增量更新的话可以参考下货拉拉的那个路由库?不知道货拉拉的ksp有没有做增量更新

这块我以前尝试解决. 好几天没有结果. 难撒