首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kotlin - MutableStateFlow发射从未收到过

Kotlin - MutableStateFlow发射从未收到过
EN

Stack Overflow用户
提问于 2021-01-13 13:47:42
回答 1查看 1.8K关注 0票数 3

当我在不同的片段中更改GameData的GameData属性时,我可以看到在存储库的侦听器中收到了更改,但是当我导航回片段时,当我使用MutableStateFlow时,视图模型从未收到更新的值。

奇怪的是,当我将流更改为MutableSharedFlow时,突然间视图模型也开始获得更新的值。有人知道为什么会发生这种事吗?我需要在这里使用MutableStateFlow,但它不起作用。

仓库:

代码语言:javascript
运行
复制
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)
                }
            }
    }

视图模型

代码语言:javascript
运行
复制
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时记录

代码语言:javascript
运行
复制
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日志:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-13 14:09:44

是的,所以可能的主要原因是,除非要发出的提议对象不等于旧值,否则MutableStateFlow不会发出。然而,MutableSharedFlow总是会发出,因为它的发射逻辑没有distinctUntilChanged()等于逻辑。

来自SharedFlow文档:

强基于等式的合并

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65703272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档