代码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>>
。