Compose学习记录(3): ViewModel数据驱动更新组件

  1. 前面已经学习过在 Composable 函数中保存UI的状态,然后修改状态来更新UI控件的内容。如:
kotlin 复制代码
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    val expand = rememberSaveable { mutableStateOf(false) }
    // ...使用expand控制是否展开
    // 修改expand的值 expand.value = !expand.value
}
  1. 业务状态会放在ViewModel中, ViewModel的状态可能是在后台更新的,当它的属性变动时,如何通知界面更新呢。

使用ViewModel, 在gradle中添加:

gradle 复制代码
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1")

ViewModel中定义会变动的属性:

kotlin 复制代码
class MainPageVModel : ViewModel() {
    private val _acceState = MutableStateFlow(false)
    val acceState: StateFlow<Boolean> = _acceState.asStateFlow()

    private fun onSecondCall(ix: Long) {
        // 查询后台状态,更新到 _acceState中
        val isOpenService = isAccessibilitySettingsOn(AppSession.getContext())
        _acceState.value = isOpenService
    }
}
  1. 在UI界面中监听属性,即时更新界面元素
    在Activity中创建ViewMode;
kotlin 复制代码
private val viewModel: MainPageVModel by viewModels()

在Compose函数中访问ViewModel

kotlin 复制代码
val viewModel: MainPageVModel = viewModel()

在同一个Activity中创建的组件,它们其实只有一个实例共用。

Compose中监听属性的变动:

kotlin 复制代码
@Composable
fun MainPage(viewModel: MainPageVModel = viewModel(), modifier: Modifier = Modifier) {
    val ctx = LocalContext.current
    val opend by viewModel.acceState.collectAsState()
    Log.i("MainPage", "View rebuilded! opend: ${opend}")
    // ...使用 opend 来修改属性的显示
}
  1. 查看它的具体实现
    它主要是使用的collectAsState()来绑定和读取待更新的数据,它也是一个 @Composable函数,查看它的调用。
    collectAsState()-> produceState() -> remember()
    最后还是到了之前使用的remember(),这些都是@Composable函数,猜测它会在内部监听了State<>的变动,然后触发重新构建了界面节点。

对于其它类型的:

对于 LiveData,需要将 LiveData 转换为 State;

对于 Flow,需要将 Flow 转换为 State。

参考:

https://developer.android.google.cn/codelabs/basic-android-kotlin-compose-viewmodel-and-state?hl=zh-cn#5

相关推荐
三少爷的鞋1 天前
现代 Android 架构指南:不要再主动设计 Callback 接口
android
TimeFine1 天前
AI 编码工作流的设计
android·ai编程
骑着蜗牛撵大象3271 天前
C++20 协程 × 屏障:手写一个 co_await 版 Barrier,让等待不再钉死线程
android·c++20·协程·并发编程·co_await·屏障同步
山东孙燕姿1 天前
设备台账重构:从一张表到三层模型
android·java·网络·低代码·重构·rxjava
蒸鱼Yuzheng1 天前
移动端 CPU 调度分析:线程亲和性、大小核迁移与卡顿
android·perfetto·性能分析·线程优化·cpu调度
booboosui1 天前
安卓唤醒词:12 维 MFCC 加 DTW,阈值 1.8
android
传奇开心果1 天前
Compose Multiplatform 共享边界实战:架构契约、互操作同步与可回退设计
android·kotlin
事圆则缓1 天前
从开机到首帧:Android 系统与应用启动流程源码分析
android
AI吃大瓜1 天前
指针压力表读数4:Android实现指针压力表读数(可实时检测)
android·指针读数·指针压力表·压力表·压力表读数
fengci.1 天前
CTF2刷题记录(困难部分)
android·开发语言·前端·学习·php