在使用Kotlin Coroutines提供的StateFlow时,为了满足以下条件:
- 所有者可以修改.
- 调用方只能读取.
您通常需要使用以下模板代码来声明它:
private val _state = MutableStateFlow(0)
val state = _state.asStateFlow()
这种方法可能会让人觉得非常多余.
有没有更好的方式,只申报一次,仍然满足上述条件?
在使用Kotlin Coroutines提供的StateFlow时,为了满足以下条件:
您通常需要使用以下模板代码来声明它:
private val _state = MutableStateFlow(0)
val state = _state.asStateFlow()
这种方法可能会让人觉得非常多余.
有没有更好的方式,只申报一次,仍然满足上述条件?
这将在具有explicit backing fields功能的Kotlin 2.0中得到支持:
val state: StateFlow<Int>
field = MutableStateFlow(0)
在类内部,编译器将允许您使用state
直接访问其支持字段,并将被视为其更具体的类型.
如果您通过将kotlin.experimental.tryK2=true
加到gradle.properties
来启用K2编译器的测试版,那么您已经可以在Kotlin 1.9中试用它了.对于生产版本,不建议这样做.
然而,这并不完全等同于您使用asStateFlow()
得到的结果,后者实际上将MuableStateFlow包装在一个新的流实例中,该实例不能从外部强制转换回MuableStateFlow.当标准可变集合没有asList()
或asSet()
时,我甚至不知道asStateFlow()
存在的原因.如果遵循约定,我认为您不必担心另一个程序员转换您的类型会给自己带来问题.