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



代码A来自这里的官方示例代码。

我认为我可以直接将_uiState传递给uiState,所以我写了代码B,看起来代码B可以很好地工作。

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

代码

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
...
}

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

没有对应MutableList()asList(),所以我不确定为什么他们觉得流需要这个功能,而集合不需要。我找不到任何关于它的讨论。它出现在第一次引入StateFlow和SharedFlow的同一个提交中。

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

val uiState = _uiState.asStateFlow()

更容易、更快捷
val uiState: StateFlow<InterestsUiState> = _uiState

val uiState = _uiState as StateFlow<InterestsUiState>

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

最新更新