MVVM架构下StateFlow维护的动态模型列表中,模型内部状态更新无法被UI持续监听的问题求助
MVVM架构下StateFlow维护的动态模型列表中,模型内部状态更新无法被UI持续监听的问题求助
我最近在MVVM架构里结合StateFlow做状态管理时碰到了个棘手的问题,折腾了好久都没找到解决办法,会不会是我一开始的实现思路就错了?先跟大家说下我的场景:
每个Model对应不同的网络输入,我用StateFlow把Model的状态变化传递给ViewModel;ViewModel维护一个动态可增删的Model列表,再把数据同步给View展示。但现在遇到了很奇怪的现象:
- Model内部的状态确实在每秒更新(我加了Log打印,能看到数值一直在涨)
- 但UI完全没跟着每秒刷新
- 只有当ViewModel里新增Model的时候,UI才会一次性刷新所有Model的当前值,但之后的每秒更新又被无视了
下面是我简化后的代码,方便大家定位问题:
Model 代码
/** Model that holds an Int and increments every second to simulate network updates */ class MySimpleModel( startValue: Int, coroutineScope: CoroutineScope ) { private val _x = MutableStateFlow(startValue) val x = _x.asStateFlow() init { coroutineScope.launch { while (true) { delay(1000) _x.update { it + 1 } // 每秒自增1 Log.d("MySimpleModel", "x -> ${x.value}") } } } }
ViewModel 代码
class MySimpleViewmodel : ViewModel() { private val _modelList = MutableStateFlow<List<MySimpleModel>>(listOf()) val modelList = _modelList.asStateFlow() init { // 模拟2秒后初始化Model列表 viewModelScope.launch { delay(2000) _modelList.update { listOf( MySimpleModel(3, viewModelScope), MySimpleModel(78, viewModelScope) ) } } } fun add(dataToAdd: MySimpleModel) { _modelList.update { it + dataToAdd } } }
View 代码
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { val viewmodel = MySimpleViewmodel() val modelList = viewmodel.modelList.collectAsStateWithLifecycle() FlowTest4listOfFlowsTheme { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> SimpleMainScreen( modifier = Modifier.padding(innerPadding), viewmodel = viewmodel, modelList.value ) } } } } } @Composable private fun SimpleMainScreen( modifier: Modifier, viewmodel: MySimpleViewmodel, modelList: List<MySimpleModel> ) { Column( modifier = modifier ) { // 新增Model的按钮 Row { Button( onClick = { viewmodel.add(MySimpleModel(6, viewmodel.viewModelScope)) } ) { Text("add") } } // 展示所有Model的数值 modelList.forEach { model -> Text(text = "${model.x.value}") } } }
目前的诡异现象
MySimpleModel里的Log每秒都在打印x的最新值,说明内部状态确实在正常更新- 但UI上的数字完全不跟着变化
- 只有点击"add"按钮新增Model时,UI才会一次性刷新所有Model的当前数值,但之后的每秒自增又没反应了
有没有大佬能帮我看看这是哪里出问题了?是不是我对StateFlow的使用方式理解错了?
内容来源于stack exchange
相关产品推荐
相关产品推荐

