我想使用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...
}
}
我只是第一次尝试使用它,所以我不完全理解它是如何工作的。
如果我替换shareIn
为stateIn
并设置null
为初始值(第三个参数),它工作正常,但是在collect
回调中我需要检查它是否不是null
在提交PagingData
给适配器之前
更新
似乎如果在开始收集 SharedFlow 之前发出值,那么新订阅者将不会收到最新值
所以我需要更改shareIn(viewModelScope, SharingStarted.Eagerly)
为
shareIn(viewModelScope, SharingStarted.WhileSubscribed())
或者
shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)
让它发挥作用
但是哪一个更好呢?我只需要保留相同的单个实例PagingData