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

相关推荐
码农coding2 小时前
android 12 中的VSYNC的请求
android
YF02112 小时前
详解Android所有文件访问权限
android
时间的拾荒人3 小时前
MySQL C语言连接 - 从入门到实战
android·c语言·mysql
Meteors.4 小时前
Android性能优化:01. 指标体系 + 分析工具链
android
jike_20265 小时前
安卓平台免费录音转文字工具深度测评:5 款 APP 功能对比与选型指南
android·智能电视
Code Man5 小时前
Windows 下使用 Appium
android·windows·appium
码农coding5 小时前
android 12 中的VSYNC接收
android
GitLqr5 小时前
Flutter 3.44 性能飞跃:深度解析 Android Platform View 的 HCPP 新特性
android·flutter·性能优化
码农coding6 小时前
android 12 SurfaceFlinger中的CompositionEngine
android
Mem0rin7 小时前
[MySQL] 聚合函数、分组查询、连接查询
android·mysql