在使用Kotlin Coroutines提供的StateFlow时,为了满足以下条件:

  1. 所有者可以修改.
  2. 调用方只能读取.

您通常需要使用以下模板代码来声明它:

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()存在的原因.如果遵循约定,我认为您不必担心另一个程序员转换您的类型会给自己带来问题.

Kotlin相关问答推荐

最好的方法来创建一个 map 在kotlin从两个列表

如何进行基于lambda/谓词的两个列表的交集?

多模块Kotlin项目中的FreeFair

仅某些用户出现 DateTimeFormatter 错误

Kotlin 基于参数类型的返回类型推断

在协程上下文中重新抛出异常

按钮无法在 Android Studio 上打开新活动

如何处理基于枚举提前返回的 forEach 循环,Kotlin 中的一条路径除外

如何在 Android Jetpack Compose 中的画布上绘制一侧加厚的描边?

.indices 在 kotlin 中的含义是什么?

Android Kotlin StringRes 数量String

Kotlin 扩展函数 - 覆盖现有方法

未找到导入 kotlinx.coroutines.flow.*

如何为kotlin异常生成SerialVersionId?

Spring Boot:更改属性占位符符号

使用主构造函数时使用Kotlin getter/setter

Kotlin 对象 vs 伴生对象(companion-object) vs 包作用域(package scoped)方法

Kotlin中的嵌套let块

使用 Kotlin 按字母对数组进行排序

可见性不适用于 Kotlin