使用 StateFlow 更新列表适配器

Using StateFlow To Update List Adapter

我正在尝试从 LiveData 切换到 StateFlow 以填充我的 ListAdapter。

我目前有一个 MutableLiveData<List<CustomClass>> 正在观察以更新列表适配器:

  viewModel.mutableLiveDataList.observe(viewLifecycleOwner, Observer {
         networkIngredientAdapter.submitList(it)
}

这很好用。现在我在 viewModel 中将 MutableLiveData<List<CustomClass>?> 替换为 MutableStateFlow<List<CustomClass>?>

 private val _networkResultStateFlow = MutableStateFlow<List<IngredientDataClass>?>(null)
    val networkResultStateFlow : StateFlow<List<IngredientDataClass>?>
    get() = _networkResultStateFlow

 fun loadCustomClassListByNetwork() {
            viewModelScope.launch {
//a network request using Retrofit
 val result = myApi.myService.getItems()
 _networkResultStateFlow.value = result
}
}

我正在这样的片段中收集新列表:


 lifecycleScope.launchWhenStarted {
 viewModel.networkResultStateFlow.collect(){
                list -> networkIngredientAdapter.submitList(list)}
}

但是,当我调用 loadCustomClassListByNetwork() 时,适配器列表没有更新。为什么我收不到值

尝试用以下代码替换片段中的代码:

lifecycleScope.launch {
viewModel.networkResultStateFlow.flowWithLifecycle(lifecycle)
         .collect { }
}

我在原始问题中没有提到,但是在创建的协程范围内进行了两次收集调用:

lifecycleScope.launchWhenStarted {

       viewModel.networkResultStateFlow.collect(){
                list -> networkIngredientAdapter.submitList(list)}

       viewModel.listOfSavedIngredients.collectLatest(){
                  list -> localIngredientAdapter.submitList(list)}
}

以前只有第一个对方付费电话有效,因此只有一个列表在更新。所以我刚刚创建了两个单独的协程范围,现在它可以工作了:

lifecycleScope.launchWhenStarted {

       viewModel.networkResultStateFlow.collect(){
                list -> networkIngredientAdapter.submitList(list)}
}

lifecycleScope.launchWhenStarted {

       viewModel.listOfSavedIngredients.collectLatest(){
                  list -> localIngredientAdapter.submitList(list)}
}

注意:使用 launchlaunchWhenStartedlaunchWhenCreated 产生相同的结果。

一旦我弄清楚每次调用都需要单独范围的原因,我将编辑我的回复。

编辑: 所以只有一个 listAdapter 正在更新的原因是因为我的每个 StateFlow 都需要一个单独的 CoroutineScope,因为 Flows 根据协程的定义 运行。每个流都使用其各自的协程范围来收集自己的值,因此您不能让流共享相同的协程范围 b/c,否则它们会冗余地收集相同的值。 @ruby6221 提供的答案也创建了一个新的协程范围,因此可能有效,但由于与升级我的 SDK 版本无关的问题,我无法对其进行测试,否则我会将其设置为正确答案。