Kotlin - MutableStateFlow 发射的数据未被接收

3
当我在不同的片段中更改GameData的isInFavorites属性时,我可以看到更改已被存储在我的库监听器中,但是当我返回到该片段时,使用MutableStateFlow时viewmodel从未接收到更新后的值。
令人奇怪的是,当我将我的流更改为MutableSharedFlow时,突然间viewmodel也开始获取更新后的值。有人知道这可能发生的原因吗?我需要在这里使用MutableStateFlow,但它不起作用。 仓库:
private val gameDataListResultMutableFlow: MutableStateFlow<Result<List<GameData>>> = MutableStateFlow(Result.Loading)



    override suspend fun observeGameDataList(): Flow<Result<List<GameData>>>
        {
   

      CoroutineScope(Dispatchers.IO + coroutineContext).launch {
                localGameDataSource.observeGameDataList().collectLatest{
                     if(it is Result.Success)
                     {
                        Timber.d("local data change favorite value of item 0: ${it.data[0].isInFavorites}")
                     }
               
                    gameDataListResultMutableFlow.emit(it)
                }
            }
    }

视图模型:

private suspend fun observeGameListResult()
{

    gameRepository.observeGameDataList().collect{

        if(it is Result.Success)
            Timber.d("data change received in viewmodel value of item 0: ${it.data[0].isInFavorites}")

        gameListResultMutableLiveData.postValue(it)
    }
}


fun getGameListResultLiveData(): LiveData<Result<List<GameData>>>
{
    launch(coroutineContext) {
        observeGameListResult()
    }

    return gameListResultMutableLiveData
}

使用StateFlow时的日志记录
LOADING THE INITIAL STATE, ISFAVORITE VALUE IS TRUE

D/DefaultGameRepository: local data change favorite value of item 0: true
D/GameListViewModel: data change received in viewmodel value of item 0: true



SWITCHING TO ANOTHER FRAGMENT TO CHANGE THE ISFAVORITE'S VALUE TO FALSE, WHICH IS RECEIVED ONLY BY 
THE LOCAL SOURCE LISTENER

D/DefaultGameRepository: local data change the favorite value of item 0: false



SWITCHING BACK TO THE INITIAL FRAGMENT AND THE UPDATED VALUE OF THE ISFAVORITE REFLECTED ON THE LOCAL SOURCE LISTENER BUT NOT ON THE VIEWMODEL LISTENER---

D/GameListViewModel: data change received in viewmodel value of item 0: true
D/DefaultGameRepository: local data change the favorite value of item 0: false

使用SharedFlow时的日志记录:

LOADING THE INITIAL STATE, ISFAVORITE VALUE IS TRUE

D/DefaultGameRepository: local data change the favorite value of item 0: true
D/GameListViewModel: data change received in viewmodel value of item 0: true
    

SWITCHING TO ANOTHER FRAGMENT TO CHANGE THE ISFAVORITE'S VALUE TO FALSE, WHICH IS RECEIVED BY LOCAL 
SOURCE AND THE VIEWMODEL LISTENER
        
D/DefaultGameRepository: local data change the favorite value of item 0: false
D/GameListViewModel: data change received in viewmodel value of item 0: false
    

SWITCHING BACK TO THE INITIAL FRAGMENT AND THE UPDATED VALUE OF THE ISFAVORITE REFLECTED ON THE 
VIEWMODEL   
 
D/DefaultGameRepository: local data change the favorite value of item 0: false
D/GameListViewModel: data change received in viewmodel value of item 0: false
D/GameListViewModel: data change received in viewmodel value of item 0: false
1个回答

6

是的,可能的主要原因是MutableStateFlow不会发出信号,除非要发出的对象与旧值不相等。然而,MutableSharedFlow将始终发出信号,因为它的发射逻辑没有那个distinctUntilChanged()相等逻辑。

从SharedFlow文档中可以看到:

基于强等式的合并

在状态流中,使用Any.equals比较方式来合并值,类似于distinctUntilChanged运算符。它用于合并对MutableStateFlow中值的更新,并在新值等于先前发出的值时抑制向收集器发出值。使用违反Any.equals协定的类的状态流行为是未指定的。

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-state-flow/index.html


我完全忘记了它会这样表现,因为在比较我的模型类时,我故意忽略了我的isFavorite属性。非常感谢。 - DeveloperKurt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接