AndroidReactive 是一个开源的 Android 响应式的业务框架. 帮助你在项目开始之初, 快速的搭建可以编写业务代码的响应式基础业务层的架构
使用前提:
- Kotlin
- Compose
项目结构解释
- reactive 响应式的业务架构的核心组件, 需要在项目中进行依赖
- reactive-template 核心组件之外的通用的业务组件(可选的)
- 使用方式1: 直接依赖此模板模块, 通过调用 ReactiveTemplate.init() 方法来自定义一些默认的视图和事件
- 使用方式2: 在你的新项目创建之后, 复制此模块的代码到你的项目中, 比如 Base 业务模块中
- reactive-template-compose 是通用业务组件的 Compose 的形式的
- reactive-template-normal 是通用业务组件非 Compose 形式的(未开发, 因为我用 Compose 两年了, 这个模块的空缺请自行填补吧)
- reactive-demo 是为了展示各种场景以及演示响应式的书写方式写的一些 Demo 代码
- build-logic 是为了简化每个模块的 gradle 配置. 此模块你不需要理会, 只是我这里项目中 Gradle 的一种配置方式, 你自己用你自己熟悉的即可
![image](https://private-user-images.githubusercontent.com/12975743/300693571-5f9a8bbb-6a7f-4c73-9bf2-fee15dd8a348.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjU5OTY1NDcsIm5iZiI6MTcyNTk5NjI0NywicGF0aCI6Ii8xMjk3NTc0My8zMDA2OTM1NzEtNWY5YThiYmItNmE3Zi00YzczLTliZjItZmVlMTVkZDhhMzQ4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTEwVDE5MjQwN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE4OTNkODRiNDllMjUyMzYxNzJjZmNhODQwMWU3MzI5M2YwOGQyYzczOWQwOTgzZjc3YmUwOGRhMWZlODU0ZmYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.4zzVt-ziCHEpOkKa96FF6xgOH9dK44A3x4Rfi4fndMQ)
![image](https://private-user-images.githubusercontent.com/12975743/300694021-3c2b92d9-bb75-4996-af5e-581a2e62c710.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjU5OTY1NDcsIm5iZiI6MTcyNTk5NjI0NywicGF0aCI6Ii8xMjk3NTc0My8zMDA2OTQwMjEtM2MyYjkyZDktYmI3NS00OTk2LWFmNWUtNTgxYTJlNjJjNzEwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTEwVDE5MjQwN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTgwOGU2MjAyZDg2MjM3MjgxOTNjMjg0NzMzMjA2NWExYTkzNGM0YmU3MzdjM2RiYzM4MWQwM2EyZWRjYzczY2EmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.lIwy5aqZusBtJ-VIUBnJv_VH6kMXpKXNgiHTM7-mMmM)
添加仓库
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
// 这行
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.xiaojinzi123:android-reactive-core:<versionTag>'
implementation 'com.github.xiaojinzi123:android-reactive-template:<versionTag>'
}
比如我在 App 中通过 init 方法设置了几个视图和几个通用场景的处理, 比如 提示 和 错误处理
class App: Application {
override fun oncreate() {
//......
ReactiveTemplate.init(
enableInit = true,
initView = {
// ....
},
errorView = {
// ....
},
loadingView = {
// ....
},
alertDialogView = { title, text, cancelText, confirmText, onDismissCallback, onConfirmCallback ->
// ....
},
tipHandle = {
// ....
},
errorHandle = {
// ....
},
)
}
}
-
创建一个业务类接口, 比如 OrderDetailUseCase, 继承 BusinessUseCase 接口
interface OrderDetailUseCase : BusinessUseCase { val xxxStateFlow: Flow<String> // ...... }
-
创建对应的业务实现接口, 继承 BusinessUseCaseImpl 类, 并且实现上面的 OrderDetailUseCase 接口
class OrderDetailUseCaseImpl( ) : BusinessUseCaseImpl(), OrderDetailUseCase { val xxxStateFlow = MutableStateFlow(value = "") // ...... }
-
创建对应的 ViewModel 这个基本属于模板代码, 里面基本不写其他代码. 除非有一些 UI 相关的, 可以处理下
@ViewLayer class OrderDetailViewModel( private val useCase: OrderDetailUseCase = OrderDetailUseCaseImpl(), ) : BaseViewModel(), OrderDetailUseCase by useCase { }
-
然后在你的 Compose 代码的根节点上, 使用 BusinessContentView
BusinessContentView<OrderDetailViewModel> { vm -> // 从 VM 代理的 OrderDetailUseCase 中订阅数据 val xxx by vm.xxxStateFlow.collectAsState(initial = "") // 你自己的视图代码, xxx 可以被使用了 }
添加仓库
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
// 这行
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.xiaojinzi123:android-reactive-core:<versionTag>'
}
自行复制 AndroidReactive reactive-template 模块中的代码到项目. 自行修改
自行修改, 你可以完全放飞自我. 飞翔吧, 少年
BusinessUseCase 接口继承了 MVIUseCase 接口. 拥有 MVI 处理的能力.
先看看 MVIUseCase 的 addIntent 方法
interface MVIUseCase : BaseUseCase {
/**
* 添加一个意图, 返回一个 [IntentAddResult] 对象, 通过这个对象可以等待意图处理完成
*/
fun addIntent(intent: Any): IntentAddResult
}
比如我们处理一个登录意图, 在点击登录的时候, 添加一个意图, 并且处理
sealed class LoginIntent {
data class Submit(
@UiContext val context: Context
) : LoginIntent()
}
vm.addIntent(
intent = LoginIntent.Submit(
context = context,
)
)
@BusinessUseCase.AutoLoading
@IntentProcess(LoginIntent.Submit::class)
private suspend fun login(
intent: LoginIntent.Submit,
) {
delay(1000)
val name = nameStateOb.first()
val password = passwordStateOb.first()
AppServices
.userSpi
?.login(
name = name,
password = password,
)
confirmDialogOrError(
content = "登录成功".toStringItemDto(),
negative = null,
)
}
对应的效果视频为:
220_1706773493.mp4
# 忽略 com.xiaojinzi.reactive.anno.IntentProcess 注解标记的所有方法
-keepclasseswithmembers class * {
@com.xiaojinzi.reactive.anno.IntentProcess *;
}