将 emit 与 Kotlin StateFlow 结合使用

Using emit with 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.

一起使用一样

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

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