android - 如何更改 kotlin StateFlow 的数据源
问题描述
我正在将此代码示例迁移到 StateFlow。
class RosterMotor(private val repo: ToDoRepository) : ViewModel() {
private val _states = MediatorLiveData<RosterViewState>()
val states: LiveData<RosterViewState> = _states
private var lastSource: LiveData<RosterViewState>? = null
init {
load(FilterMode.ALL)
}
fun load(filterMode: FilterMode) {
lastSource?.let { _states.removeSource(it) }
val items =
repo.items(filterMode).map { RosterViewState(it, filterMode) }.asLiveData()
_states.addSource(items) { viewstate ->
_states.value = viewstate
}
lastSource = items
}
...
}
此示例取自https://commonsware.com/AndExplore/ book
我可以想到这个解决方案,但我不确定这是否是最好的方法
private val _states = MutableStateFlow(RosterViewState())
val states: StateFlow<RosterViewState> = _states
init {
load(ALL)
}
fun load(filterMode: FilterMode) {
viewModelScope.launch {
repository.items(filterMode).map { RosterViewState(it, filterMode) }
.collect {
_states.value = it
}
}
}
那么我们如何使用 StateFlow 来实现这个场景。
解决方案
推荐阅读
- python - Python,使用difflib逐字比较两个句子
- sql - 递归 CTE - 排除后重新计算树
- python - 您如何为同一点绘制多种颜色?
- flutter - Flutter,无密码并使用电子邮件和密码注册,端点是什么?
- python - 无法通过 pip install 安装 Python 包 hdt。它收到一个错误:命令失败,退出状态为 2
- javascript - 仅从字符串中获取时间
- python - 时间戳 - 如何使用 groupby 计算以秒为单位的时间差
- r - R中的Mclust和sklearn中的高斯混合之间的区别
- python - 自定义 BootstrapDateTimePickerInput
- r - 包含带有小号或等号的表达式的标签的粗体