为什么ViewModel中使用mutableStateOf系列API而非remember?
问题解答
1. ViewModel是否承担了类似remember的状态留存职责?
是的,该结论成立。
remember的核心作用是在Composable组件重组时,保留对应状态实例不会被重复初始化,但其绑定的是Composable的生命周期,一旦所属的组件树被销毁(比如横竖屏切换、页面回退),remember存储的状态就会丢失。
而ViewModel的生命周期远长于Composable组件,只要其绑定的Activity/Fragment没有被彻底销毁,即便是配置变更(横竖屏切换、系统语言切换等)导致页面重建,ViewModel实例也不会被回收,存放在ViewModel中的State状态自然会被保留。所以在ViewModel中声明状态时不需要额外嵌套remember,ViewModel本身已经实现了更高范围的状态留存能力。
2. 为什么mutable系列状态API不需要通过委托实现?
首先需要明确:mutable系列状态API不是必须不用委托,只是存在两种可选写法,不使用委托是更通用的习惯,原因如下:
- 只有基于
mutableStateOf声明的单值状态可以使用委托,委托的核心作用是省略.value的读写操作,你完全可以在ViewModel中选择委托写法,只要导入对应扩展即可:import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue class CustomViewModel : ViewModel() { var userName by mutableStateOf("") // 合法写法,直接读写userName即可,不需要加.value } - 对于集合类的mutable状态API比如
mutableStateListOf、mutableStateMapOf,它们返回的实例本身就实现了原生集合的MutableList、MutableMap接口,直接调用add/remove/put等方法就能触发状态更新,不存在.value的调用需求,委托对这类集合状态没有任何作用,自然不需要使用委托。 - 多数开发者在ViewModel中声明状态时,为了统一写法,会主动省略委托的使用,统一通过
.value读写单值状态、直接调用方法操作集合状态,不需要额外导入委托相关的扩展。
内容的提问来源于stack exchange,提问作者Suee97
相关产品推荐
相关产品推荐

