0

我想使用SharedFlow而不是StateFlow因为第一个不需要初始值

视图模型

val photosPaginData = photoRepository.getPhotosPagingData() // Flow<PagingData<Photo>>
    .cachedIn(viewModelScope)
    .shareIn(viewModelScope, SharingStarted.Eagerly)

片段

viewLifecycleOwner.lifecycleScope.launchWhenStarted {
    viewModel.photosPaginData.collect { pagingData ->
        photosAdapter.submitData(pagingData) // no calls here...
    }
}

我只是第一次尝试使用它,所以我不完全理解它是如何工作的。

如果我替换shareInstateIn并设置null为初始值(第三个参数),它工作正常,但是在collect回调中我需要检查它是否不是null在提交PagingData给适配器之前

更新

似乎如果在开始收集 SharedFlow 之前发出值,那么新订阅者将不会收到最新值

所以我需要更改shareIn(viewModelScope, SharingStarted.Eagerly)

shareIn(viewModelScope, SharingStarted.WhileSubscribed())

或者

shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)

让它发挥作用

但是哪一个更好呢?我只需要保留相同的单个实例PagingData

4

1 回答 1

0

我建议不要使用SharingStarted.Eagerly,因为它永远不会取消上游流,即使观察活动/片段不再观察。

安卓应用提示!您可以在大多数情况下使用 WhileSubscribed(5000) 在最后一个收集器消失后保持上游流活动 5 秒以上。

取自:https ://medium.com/androiddevelopers/things-to-know-about-flows-sharein-and-statein-operators-20e6ccb2bc74

于 2021-11-26T23:22:28.310 回答