- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用三个 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(...)
在大多数情况下,如果是这样,这里会是什么样子?
最佳答案
可以使用 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/
我有一个生成消息的 JMS 队列。我想与多个 Kotlin 消费者共享这些消息,但前提是连接了 Kotlin 消费者。如果 Kotlin 消费者仅激活 5 分钟,它应该只在该窗口内接收消息。 Kotl
在我的 ViewModel 中,我发出 API 请求并使用 StateFlow 和 SharedFlow 与 fragment 通信。在发出 API 请求时,我可以轻松地更新状态流的值并成功收集到 f
我有一个 SharedFlow .当ViewModel已创建,我将值更改为 Val1 .之后,我使用 viewModelScope对 3 seconds 进行一些虚假的延迟然后将值更改为 Val2 .
我试图使用 sharedFlow 将事件从 UI 传递到 viewModel 这是我的 View 模型类 class MainActivityViewModel () : ViewModel() {
我有一个使用三个 LiveData 源的 MediatorLiveData。当它们中的任何一个发出一个新值并且我每个都有一个时,我使用这三个值来生成 UI 的输出。 其中两个来源是关于如何对列表进行排
和 有什么区别?共享流 和 状态流 ? 以及如何在 中使用这些MVI 建筑学?使用简单 更好吗?流量 还是这些状态和事件? 最佳答案 Flow 很冷!,这意味着它仅在收集数据时才发出数据。 Flow
我第一次潜入 Kotlin Flow,我想知道 ViewModel 是否还有一席之地。 ViewModel 的优势在于它具有生命周期感知能力,并且会在 Activity 被销毁时自动取消对 ViewM
我有一个具有以下属性的 android viewmodel 类 private val _trainingNavigationEvents = MutableSharedFlow(replay = 0
嘿,我正在学习 kotlin 中的流程。我正在学习 可变状态流 和 可变共享流 .我努力学习 可变状态流 在现实世界的例子中。但我无法获得 可变共享流 例如,它更适合哪个地方。我尝试了一些 可变状态流
我正在合并两个 SharedFlows,然后执行一个长时间的工作操作。 一开始,我知道状态,所以我为两个流发出一个“起始值”。之后,用户可以发送到任一流。 这两个流大多是独立的,但在特定情况下,用户可
我读过类似的主题,但找不到正确的答案: How to end / close a MutableSharedFlow? Kotlin Flow: How to unsubscribe/stop Sta
我是一名优秀的程序员,十分优秀!