将 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
直到现在我一直在使用 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