gpt4 book ai didi

android - 将 MediatorLiveData 迁移到 SharedFlow

转载 作者:行者123 更新时间:2023-12-04 23:39:11 29 4
gpt4 key购买 nike

我有一个使用三个 LiveData 源的 MediatorLiveData。当它们中的任何一个发出一个新值并且我每个都有一个时,我使用这三个值来生成 UI 的输出。
其中两个来源是关于如何对列表进行排序和过滤的用户设置,第三个是从 Room 数据库 Flow 中提取的列表数据。
它看起来像这样:

val thingsLiveData: LiveData<List<Thing>> = object: MediatorLiveData<List<Thing>>() {
var isSettingA: Boolean = true
var settingB: MySortingEnum = MySortingEnum.Alphabetical
var data: List<Thing>? = null
init {
addSource(myRepo.thingsFlow.asLiveData()) {
data = it
dataToValue()
}
addSource(settingALiveData) {
isSettingA= it
dataToValue()
}
addSource(settingBLiveData) {
settingB= it
dataToValue()
}
}
private fun dataToValue() {
data?.let { data ->
viewModelScope.launch {
val uiList = withContext(Dispatchers.Default) {
produceUiList(data, isSettingA, settingB)
}
value = listItems
}
}
}
}
我正在寻找一种将其转换为 SharedFlow 的干净方法,最好没有任何 @ExperimentalCoroutinesApi .我遇到的唯一 SharedFlow builder 函数是 callbackFlow ,这是不适用的。您打算使用 flow { ... }.asSharedFlow(...)在大多数情况下,如果是这样,这里会是什么样子?
这两个设置 LiveData 我也计划迁移到流中。

最佳答案

可以使用 combine() 组合源流,这会创建一个冷流,当它被收集时,它将开始从它的源流中收集,它可能是热的或冷的。
我最初在想我一定是遗漏了一些东西,应该有某种方法可以将热流直接组合成一个组合热流。但是我意识到,如果您需要,运算符(operator)应该只返回冷流并让您将其转换回热流,这是有道理的。
在许多情况下,例如我的情况,让它保持凉爽是完全可以的。我只从我的 UI 中的一个地方收集这个流,所以它只在收集时才开始合并源并不重要。源热流不关心当前是否有东西在收集它们……不管怎样,它们只会继续发射。
如果我从多个地方或多次收集此流,那么使用 shareIn 可能是有意义的在合并的 Flow 上使其变热,这将避免合并源的冗余工作。潜在的缺点是,即使没有收集任何东西,它也会结合这些来源,这将是浪费工作。

val thingsFlow: Flow<List<Thing>> = combine(
myRepo.thingsFlow,
settingALiveData.asFlow(),
settingBLiveData.asFlow()
) { data, isSettingA, settingB -> produceUiList(data, isSettingA, settingB) }

// where produceUiList is now a suspend function that wraps
// blocking code using withContext

关于android - 将 MediatorLiveData 迁移到 SharedFlow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65401721/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com