Android,Kotlin
我在数据源类中有以下LiveData,我不能改变它为StateFlow,因此需要在我的viewModel中将其转换为StateFlow。
val trackingCatalogInitialLoadLiveData: LiveData<Pair<CatalogTracking, Int>> by lazy {
instantSearchDataSourceLiveData.switchMap { instantSearchDataSource ->
instantSearchDataSource.initialLoadLiveData
}
}
在我的ViewModel中,我有以下内容,这就是我不确定将LiveData转换为StateFlow的正确方法:
val trackingCatalogInitialLoadStateFlow: StateFlow<Pair<CatalogTracking, Int>> by lazy {
instantSearchDataSourceFactory.trackingCatalogInitialLoadLiveData.asFlow()
.stateIn(viewModelScope, SharingStarted.Lazily, Pair(CatalogTracking(), 0))
}
然后在我的片段中,我只是收集结果。
coroutineScope.launch {
mInstantSearchViewModel.trackingCatalogInitialLoadStateFlow.collect { trackingPair ->
// code here
}
这是否是将LiveData转换为StateFlow的最佳实践?有什么需要注意的地方吗?
stateIn
中小心使用SharingStarted.Lazily
- 据我所知,它不会启动更新状态流的协程,直到在其上调用collect {}
。这意味着如果您只访问stateFlow.value
,它将永远停留在初始值上。当然,在这里似乎不是您的情况,因为您确实调用了collect
,但如果您正在寻找一般陷阱,请记住这一点。 - JoffreyviewLifecycle.lifecycleScope
,以确保你不会泄漏视图或尝试在它们可能已经被销毁后更新视图。 - Tenfour04