Android 响应式架构

前言

AndroidReactive 是一个开源的 Android 响应式的业务框架. 帮助你在项目开始之初, 快速的搭建可以编写业务代码的响应式基础业务层的架构

使用前提:

  • Kotlin
  • Compose

项目结构解释

  • reactive 响应式的业务架构的核心组件, 需要在项目中进行依赖

  • reactive-template 核心组件之外的通用的业务.

    • 使用方式1: 直接依赖此模板模块, 通过调用 ReactiveTemplate.init() 方法来自定义一些默认的视图和事件
    • 使用方式2: 在你的新项目创建之后, 复制此模块的代码到你的项目中, 比如 Base 业务模块中
  • reactive-demo 是为了展示各种场景以及演示响应式的书写方式写的一些 Demo 代码

  • build-logic 是为了简化每个模块的 gradle 配置. 此模块你不需要理会, 只是我这里项目中 Gradle 的一种配置方式, 你自己用你自己熟悉的即可

架构图

响应式架构图

MVI 架构图

使用方式1: (核心架构 + 对应架构模板)

添加依赖

添加仓库

scss 复制代码
dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
    mavenCentral()
    // 这行
    maven { url 'https://jitpack.io' }
  }
}

添加依赖

arduino 复制代码
dependencies {
  implementation 'com.github.xiaojinzi123:android-reactive-core:<versionTag>'
  implementation 'com.github.xiaojinzi123:android-reactive-template:<versionTag>'
}

自定义(方法是可选的, 里面的每个参数也都是可选的!!!)

比如我在 App 中通过 init 方法设置了几个视图和几个通用场景的处理, 比如 提示 和 错误处理

kotlin 复制代码
class App: Application {
  override fun oncreate() {
    //......
    ReactiveTemplate.init(
      enableInit = true,
      initView = {
          // ....
      },
      errorView = {
          // ....
      },
      loadingView = {
          // ....
      },
      alertDialogView = { title, text, cancelText, confirmText, onDismissCallback, onConfirmCallback ->
          // ....
      },
      tipHandle = {
          // ....
      },
      errorHandle = {
          // ....
      },
    )
  }
}

愉快使用

  1. 创建一个业务类接口, 比如 OrderDetailUseCase, 继承 BusinessUseCase 接口

    kotlin 复制代码
    interface OrderDetailUseCase : BusinessUseCase {
        val xxxStateFlow: Flow<String>
        // ......
    }
  2. 创建对应的业务实现接口, 继承 BusinessUseCaseImpl 类, 并且实现上面的 OrderDetailUseCase 接口

    scss 复制代码
    class OrderDetailUseCaseImpl(
    ) : BusinessUseCaseImpl(), OrderDetailUseCase {
        val xxxStateFlow = MutableStateFlow(value = "")
        // ......
    }
  3. 创建对应的 ViewModel 这个基本属于模板代码, 里面基本不写其他代码. 除非有一些 UI 相关的, 可以处理下

    kotlin 复制代码
    @ViewLayer
    class OrderDetailViewModel(
        private val useCase: OrderDetailUseCase = OrderDetailUseCaseImpl(),
    ) : BaseViewModel(),
        OrderDetailUseCase by useCase {
    }
  4. 然后在你的 Compose 代码的根节点上, 使用 BusinessContentView

    kotlin 复制代码
    BusinessContentView<OrderDetailViewModel> { vm ->
      // 从 VM 代理的 OrderDetailUseCase 中订阅数据
      val xxx by vm.xxxStateFlow.collectAsState(initial = "")
      // 你自己的视图代码, xxx 可以被使用了
    }

使用方式2: (核心架构 + 自定义模板架构)

添加依赖

添加仓库

scss 复制代码
dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
    mavenCentral()
    // 这行
    maven { url 'https://jitpack.io' }
  }
}

添加依赖

arduino 复制代码
dependencies {
	implementation 'com.github.xiaojinzi123:android-reactive-core:<versionTag>'
}

自行复制 AndroidReactive reactive-template 模块中的代码到项目. 自行修改

自行修改, 你可以完全放飞自我. 飞翔吧, 少年

MVI 的支持

BusinessUseCase 接口继承了 MVIUseCase 接口. 拥有 MVI 处理的能力.

先看看 MVIUseCase 的 addIntent 方法

kotlin 复制代码
interface MVIUseCase : BaseUseCase {
    /**
     * 添加一个意图, 返回一个 [IntentAddResult] 对象, 通过这个对象可以等待意图处理完成
     */
    fun addIntent(intent: Any): IntentAddResult
}

比如我们处理一个登录意图, 在点击登录的时候, 添加一个意图, 并且处理

less 复制代码
sealed class LoginIntent {
    data class Submit(
        @UiContext val context: Context
    ) : LoginIntent()
}
ini 复制代码
vm.addIntent(
    intent = LoginIntent.Submit(
    		context = context,
    )
)
kotlin 复制代码
@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,
    )
}

对应的效果视频为:

相关推荐
冬夜戏雪13 分钟前
实习面经记录(十)
java·前端·javascript
huwuhang30 分钟前
索尼PS3游戏合集【中文游戏】8.12T 1430个游戏+PS3模拟器
android·游戏·智能手机·游戏机·电视
爱学习的程序媛2 小时前
【Web前端】JavaScript设计模式全解析
前端·javascript·设计模式·web
小码哥_常2 小时前
从SharedPreferences到DataStore:Android存储进化之路
前端
老黑2 小时前
开源工具 AIDA:给 AI 辅助开发加一个数据采集层,让 AI 从错误中自动学习(Glama 3A 认证)
前端·react.js·ai·nodejs·cursor·vibe coding·claude code
jessecyj2 小时前
Spring boot整合quartz方法
java·前端·spring boot
苦瓜小生2 小时前
【前端】|【js手撕】经典高频面试题:手写实现function.call、apply、bind
java·前端·javascript
天若有情6732 小时前
前端HTML精讲03:页面性能优化+懒加载,搞定首屏加速
前端·性能优化·html
Grackers3 小时前
Android Perfetto 系列 5:Android App 基于 Choreographer 的渲染流程
android
踩着两条虫3 小时前
AI驱动的Vue3应用开发平台深入探究(十):物料系统之内置组件库
android·前端·vue.js·人工智能·低代码·系统架构·rxjava