首页 > 解决方案 > 将 emit 与 Kotlin StateFlow 一起使用

问题描述

到目前为止,我一直在使用Flow它并将其映射到LiveData如下所示 -

MyService看起来像这样-

override fun provideData(action: MyAction) = flow {
   emit(MyResult.Loading)
   emit(dataRepository.getNewData())
}

ViewModel看起来像这样-

fun getData() = myService.provideData(MyAction.GetData).map {
                
}.asLiveData(Dispatchers.Default + viewModelScope.coroutineContext)

我想搬到StateFlow. 我如何使用emit函数,StateFlow就像我使用它一样Flow

标签: androidkotlinandroid-livedatakotlin-coroutines

解决方案


您可以像以前一样编写流程,但替换.asLiveData(scope).stateIn(scope, SharingStarted.Eagerly, null)以获取StateFlow在相应范围内运行的实例,并具有与您之前获得的类似行为LiveData- 共享立即开始并且初始值为null(就像 with 一样LiveData)。

您可以在这里阅读更多详细信息和所有stateIn运算符参数的解释https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/state-in.html


推荐阅读