【发布时间】:2022-01-06 12:46:01
【问题描述】:
有一个函数collectAsState()适用于StateFlow属性,以便在Composable中观察它。
可组合项需要StateFlow,因为StateFlow 保证了初始值。 Flow 不提供该保证。
现在,如果我有 StateFlow 属性但我想在收集 Composable 中的 Flow 之前应用运算符(如 map),该怎么办?
这里是一个例子:
假设存储库公开了StateFlow<MyClass>
val myClassStateFlow: StateFlow<MyClass>
data class MyClass(val a: String)
...并且视图模型依赖于存储库,并且只想将属性 a 公开给它的Composable...
val aFlow = myClassState.Flow.map { it.a } // <- this is of type Flow<String>
map 运算符将类型从 StateFlow<MyClass> 更改为 Flow<String>。
-
aFlow不再具有初始值在语义上是否合理?毕竟它的第一次发射是从myClassStateFlow的初始值导出的。 - 有时需要将
Flow转换回StateFlow。哪个是更惯用的地方?- 在视图模型中使用
stateIn()?代码会是什么样子? - 在可组合中使用
collectAsState(initial: MyClass)并得出一个初始值(虽然myClassStateFlow有一个初始值)?
- 在视图模型中使用
【问题讨论】:
标签: android android-jetpack-compose kotlin-coroutines kotlin-stateflow