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

相关推荐
alexhilton6 小时前
模块化Jetpack Compose架构
android·kotlin·android jetpack
厮年断弦8 小时前
AI 辅助开发实录:一周做完一个 Android 本地音乐播放器,这些坑替你踩了
android
hai_android9 小时前
InputStage 责任链核心执行流程
android·android studio·android jetpack
mmsx11 小时前
Android 测绘计算工程化:七四参数、高程拟合与单位系统
android·kotlin
我是场13 小时前
我的NPI项目之-Touch的EE特性
android·arm开发
天空之城--13 小时前
Android一周动态:AI编程、Compose与车载生态新信号
android·flutter
恋猫de小郭15 小时前
Dart 4.0 要彻底移除 dart:mirrors,Augmentations 应该要来了
android·前端·flutter
Carson带你学Android16 小时前
Gemini 4 Argon 发布:对 Android 开发者意味着什么?
android·ai编程
事圆则缓17 小时前
Kotlin Flow、StateFlow、SharedFlow 全解析:冷流、热流与 Android 状态管理
android·kotlin·php
应用市场17 小时前
把旧 Pixel 变成相册备份中转站(上):Mac 到安卓的照片传输工具设计——流式上传、sha256 校验、adb forward 与 Bonjour
android·macos·adb·kotlin·swift