为什么作者需要在 Compose 中使用 asStateFlow() ?

Hel*_*oCW 8 kotlin

代码 A 是视频中的示例代码。

我不明白为什么作者需要使用asStateFlow().

我觉得Code B 还可以吧?

代码A

class MainViewModel: ViewModel() {
    private val _stateFlow= MutableStateFlow("Hello World")
    val stateFlow = _stateFlow.asStateFlow()
    ...
}
Run Code Online (Sandbox Code Playgroud)

代码B

class MainViewModel: ViewModel() {
    private val _stateFlow= MutableStateFlow("Hello World")
    val stateFlow = _stateFlow
    ...
}
    
Run Code Online (Sandbox Code Playgroud)

Ger*_*ssy 12

代码 A使stateFlow 状态流变为只读,而代码 B按原样公开可变状态流。

的文档asStateFlow()对此非常清楚:

将此可变状态流表示为只读状态流。

如果您看一下实现,您可以看到它将当前(可变)流包装在ReadonlyStateFlow只读的 a 中:

public fun <T> MutableStateFlow<T>.asStateFlow(): StateFlow<T> =
    ReadonlyStateFlow(this, null)
Run Code Online (Sandbox Code Playgroud)

为了更容易理解,如果您在组件中使用,则在代码 AMainViewModel的情况下,该外部人员将能够读取值,但无法写入它们。同时,如果您使用代码 B,外部组件可能会将自己的值发送到状态流。这通常是不可取的,因为发送数据(这称为单向数据流)作为对来自观察者(视图组件)的操作的响应应该是 的责任。ViewModel

  • @Pitos显式指定类型不会使其成为只读,它只是隐藏实例的某些功能。在这种情况下,只需将 `stateFlow` 转换为 `MutableStateFlow` 就可以使其再次可写,因此这将在您的解决方案中起作用:`(stateflow as MutableStateFlow&lt;String&gt;).emit("hack")`,但会因“asStateFlow()”而崩溃。 (3认同)