android - 将 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
。
解决方案
您可以像以前一样编写流程,但替换.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
推荐阅读
- javascript - cesium.js 圆锥随着卫星模型的航向、俯仰、横滚而变化,圆锥的顶点位置保持不变
- reactjs - 获取对 Card Body 的 DOM 引用以向下滚动
- javascript - 条件接口或静态类属性和打字稿
- spring-cloud-feign - 请求处理失败;嵌套异常是 feign.RetryableException: Read timed out execution POST
- python - 在 Python 中缩放正态分布
- tensorflow - 如何使用 P5 createVector 创建的向量作为 tensorflow.js 中的张量
- node.js - 来自源“http://localhost:8080”的 AWS API GATEWAY 已被 CORS 策略阻止
- python - 我可以在 Python 中找到与单词的相关性吗?
- javascript - 在vue js中添加新行时尝试逐日添加
- reactjs - 如何创建一个变量来异步设置数据并在没有多个异步调用的情况下在挂钩的多个实例之间共享?