1

代码 A 来自此处的官方示例代码。

我觉得可以直接传给_uiStateuiState所以我写了Code B,看来Code B可以很好用。

我可以直接将MutableStateFlow对象传递给StateFlow变量吗?

代码 A

class InterestsViewModel(
    private val interestsRepository: InterestsRepository
) : ViewModel() {

    // UI state exposed to the UI
    private val _uiState = MutableStateFlow(InterestsUiState(loading = true))
    val uiState: StateFlow<InterestsUiState> = _uiState.asStateFlow()

    ...
}

代码 B

class InterestsViewModel(
    private val interestsRepository: InterestsRepository
) : ViewModel() {

    // UI state exposed to the UI
    private val _uiState = MutableStateFlow(InterestsUiState(loading = true))
    val uiState: StateFlow<InterestsUiState> = _uiState

    ...
}
4

1 回答 1

2

是的,这很好。有一个小的功能优势asStateFlow()。它不仅向上转换为只读的 StateFlow,而且还将其包装在只读的 StateFlow 中,这样接收者就无法将其转换为 MutableStateFlow 并使用其发布功能。然而,这应该被认为是任何合理的代码都不应该做的事情,因为强制改变被声明为只读的东西是自找麻烦。

没有等价物asList()MutableList()所以我不确定为什么他们认为 Flows 需要此功能而 Collections 不需要。我找不到任何关于它的讨论。它出现在首次引入 StateFlow 和 SharedFlow 的同一提交中。

的第二个特点asStateFlow()是它允许更简洁地编写这种代码。

val uiState = _uiState.asStateFlow()

比写起来更容易、更快捷

val uiState: StateFlow<InterestsUiState> = _uiState

或者

val uiState = _uiState as StateFlow<InterestsUiState>

特别是如果类型很长或很复杂,例如StateFlow<List<SomeApi.Subtype>>,例如。

于 2021-10-24T02:39:16.503 回答