Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
molast opened this issue Nov 4, 2024 · 12 comments

Comments

@molast
Copy link

molast commented Nov 4, 2024

用了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
Copy link
Owner

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

@xiaojinzi123
Copy link
Owner

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

@molast
Copy link
Author

molast commented Nov 4, 2024

这个自动生成确实是可以解决,但是路由跳转仍然是没有用,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
Copy link
Owner

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

@xiaojinzi123
Copy link
Owner

这个自动生成确实是可以解决,但是路由跳转仍然是没有用,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

@xiaojinzi123 xiaojinzi123 changed the title 真是无语了,配置了多模块,用了ksp,那个自动生成的代码,会自动消失 配置了多模块,用了ksp,那个自动生成的代码,会自动消失 Nov 4, 2024
@molast
Copy link
Author

molast commented Nov 4, 2024

我就知道你会问这个依赖问题,我是从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
Copy link
Author

molast commented Nov 4, 2024

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

@xiaojinzi123
Copy link
Owner

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

@molast
Copy link
Author

molast commented Nov 4, 2024

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

@xiaojinzi123
Copy link
Owner

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

@molast
Copy link
Author

molast commented Nov 4, 2024

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

@xiaojinzi123
Copy link
Owner

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants