ComponentBus 用于组件(module)间的通信, 而不必相互依赖.
ComponentBusVersion = 0.3.0
参考 example 示例
-keep class cn.moltres.component_bus.* {*;}
-keep class cn.moltres.component_bus.interceptor.* {*;}
-keep class cn.moltres.component_bus.annotation.* {*;}
-keepclasseswithmembers class * implements cn.moltres.component_bus.interceptor.IInterceptor {
<fields>;
<methods>;
}
- 仅支持 7.4.2 及以上版本
plugins {
id 'com.android.application' version '7.4.2' apply false
id 'com.android.library' version '7.4.2' apply false
id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
id "com.google.devtools.ksp" version "1.7.10-1.0.6" apply false
id "cn.moltres.component_bus.register" version "$ComponentBusVersion" apply false
}
plugins {
id "com.google.devtools.ksp"
id 'cn.moltres.component_bus.register'
}
// 扫描列表会根据包名匹配需要扫描的类文件, 包含包内子包下的文件
componentBusExt {
// 需要扫描的进行添加(拦截器等包名, 可以是主包名)
packageNameScanList = [
"com.xxx.bbb",
"com.xxx.aaa"
]
}
plugins {
id "com.google.devtools.ksp"
}
// 添加依赖
api "cn.moltres.component_bus:core:$ComponentBusVersion"
ksp "cn.moltres.component_bus:processor:$ComponentBusVersion"
@Component(componentName = "组件名称")
object MainComponent {
@Action(actionName = "事件名称")
fun event1(params1: Int, params2: Int): Boolean {
return params1 > params2
}
// 挂起函数,必须使用 call 函数调用
@Action(actionName = "事件名称2", interceptorName = ["拦截器类名称"])
suspend fun event2(params1: String, params2: String): String {
return params1 + params2
}
// 可以直接返回对应的 Result
@Action(actionName = "事件名称3")
fun event3(params1: Int, params2: Int): Result<Boolean> {
return Result.resultError(code = 1, msg = "参数 params1 应在 0-10 之间")
}
}
object TestInterceptor : IInterceptor {
override suspend fun <T> intercept(chain: Chain): Result<T> {
Log.e("TestInterceptor", "${chain.request.componentName} 执行了 TestInterceptor")
return chain.proceed()
}
override fun <T> interceptSync(chain: Chain): Result<T> {
Log.e("TestInterceptor", "${chain.request.componentName} 执行了 TestInterceptor Sync")
return chain.proceedSync()
}
}
object LoginInterceptor : IInterceptor {
override suspend fun <T> intercept(chain: Chain): Result<T> {
return if (UsercenterComponent.isLogin == true) {
chain.proceed()
} else {
UsercenterComponent.showLogin()
Result.resultError(-3, "拦截, 进入登录页")
}
}
override fun <T> interceptSync(chain: Chain): Result<T> {
return if (UsercenterComponent.isLogin == true) {
chain.proceedSync()
} else {
UsercenterComponent.showLogin()
Result.resultError(-3, "拦截, 进入登录页")
}
}
}
object LogGlobalInterceptor : GlobalInterceptor() {
init {
priority = 10 // 用于设置拦截器的优先级,越高执行顺序越靠前
}
override suspend fun <T> intercept(chain: Chain) = chain.proceed<T>().apply {
Log.i("Component", "Component: ${chain.request.componentName}${Utils.separatorLine}Action: ${chain.request.action}${Utils.separatorLine}Result: ($code) $msg $data")
}
override fun <T> interceptSync(chain: Chain) = chain.proceedSync<T>().apply {
Log.i("Component", "Component: ${chain.request.componentName}${Utils.separatorLine}Action: ${chain.request.action}${Utils.separatorLine}Result: ($code) $msg $data")
}
}
val result = ComponentBus.with("组件名称", "事件名称")
.params("params1", 1)
.interceptors("TestInterceptor")
.apply {
params["params2"] = 2 // 两种添加参数方式是等效的
interceptors.add("TestInterceptor2")
}
.callSync<Boolean>()
搜索插件 ComponentBus 添加
快捷键:option + B
Tools -> ComponentBus -> ComponentSelect
ComponentBus.with("ComponentName", "ActionName")
输入匹配的组件名提示补全组件名称
当首字母输入数字时,会显示全部组件名称
提示所属组为 ComponentBus