问题标签 [kotlin-sharedflow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1169 浏览

kotlin - LiveData 转换为 StateFlow / SharedFlow

StateFlow / SharedFlow 中这种实时数据转换的等效代码是什么?

基本上,我想听每个查询更改以响应返回的内容。所以,任何类似于使用 StateFlow / SharedFlow 的东西都是受欢迎的。

0 投票
0 回答
107 浏览

kotlin - 将 MutableSharedFlow 与标准 Flow 结合使用

我不确定如何解决这个问题。我有一个存储combine流的变量。我必须结合 MutableSharedFlow 和 Flow。这是我使用的代码

这里是 reloadUsers 的定义

这是nicknameQuery的定义

我使用 nickbnameQuery 在昵称中运行查询并使用 reloadUsers 强制从网络获取。

在视图模型中,我使用此代码更新 reloadUsers

我的问题是当我在 reloadUsers 上运行 Refresh.FORCE 后更改nicknameQuery 的值时。因为每次我更改nicknameQuery 时,都会执行combine,但是在reloadUsers 中我再次FORCE。我想将 MutableSharedFlow 用作“触发器”,因此只有在我想强制它时才会强制重新加载。我应该重置 SharedFlow 的值,但我该如何正确处理呢?

0 投票
0 回答
534 浏览

android - Android - MutableSharedFlow 无法收集多个订阅者的新值

我想创建一个共享视图模型,用于 MainActivity 与片段之间的通信。我决定使用共享流来管理事件。

我不需要缓存最后一个事件,即使方向改变也是如此。所以我设置了“replay = 0”

当我仅在主要活动中收集事件时 - 一切正常:

将第二个订阅者添加到另一个片段时 - 两个订阅者在第一个之后都停止接收事件(第一个事件发送成功..)我可以做些什么来订阅多个 MutableSharedFlow?我试图增加“重播”的数量并更改“onBufferOverflow” - 似乎没有任何效果..

0 投票
1 回答
396 浏览

kotlin - Kotlin SharedFlow 组合操作。在特定情况下具有 zip 行为

我将两者结合起来SharedFlows,然后执行长时间的工作。

一开始,我知道状态,所以我为两个流发出一个“起始值”。之后,用户可以向任一流发出。

两个流大多是独立的,但在特定情况下,用户可以同时向两个流发出。这样做的作用是触发了两次组合,并且执行了两次长时间的工作,而实际上,在这种情况下,我只对接收这两个值感兴趣,但只执行一次。

这是我所拥有的:

这可以产生:

或这个:

由于缓冲区溢出,有时我可以实现我想要的(这是最新的),但在其他人身上,我有values 10 - e. Starting to perform a long working job我不感兴趣的。

有什么办法可以强制,当发射到两个时,只开始一次长时间的工作?

https://pl.kotl.in/JA1Wdhra9

0 投票
0 回答
296 浏览

java - 从 Java 收集的 SharedFlow 不起作用

我有一小部分活动需要在后台生成的某些事件上重新启动。由于这将是一个短期的解决方法,我认为侵入性最小的方法是在存储库中拥有一个共享流,从 UI 一路观察,但由于某种原因它不起作用:我可以看到价值发出,但 UI 不对其作出反应。

我当前的代码:

我可以确认事件已发出(在调试中,包含的行emit()已被执行)但是 Activity 中的观察者永远不会被激活。知道为什么吗?

提前致谢

0 投票
1 回答
712 浏览

android - 我什么时候应该在 Fragment 生命周期中收集 SharedFlow 事件

我认为可以在 onViewCreated 上收集 SharedFlow 数据。但是当我替换片段 n 次然后向 SharedFlow 触发一些事件时,它会向我发出 n 次事件而不是一个事件。

我已经修复了我如何将代码放在我的 Fragment 上的 onCreate 上。但我还没有找到任何关于此的文档。我是否遗漏了什么,或者我应该继续在 Fragment 的 onCreate 中使用 SharedFlow 集合?

这是我在 ViewModel 的 SharedFlow 定义

0 投票
1 回答
558 浏览

android - Android 项目中的 SharedFlow 无法按预期工作

我试图使用 sharedFlow 将事件从 UI 传递到 viewModel 这是我的 viewmodel 类

这就是我发出动作的方式

第一次发射按预期发生,但随后它没有从视图模型发射/收集。

我在这里做错什么了吗?

0 投票
2 回答
884 浏览

android - ui中再次收集StateFlow最后一个值

所以最近我一直在使用 StateFlow、SharedFlow 和 Channels API,但我在尝试将我的代码从 LiveData 迁移到表示层中的 StateFlow 时遇到了一个常见的用例。

我面临的问题是,当我发出数据并在 viewModel 中收集它时,我可以将值设置为 mutableStateFlow,当它最终到达片段时,它使用 Toast 显示一些信息性消息,让用户知道是否有错误发生或一切顺利。接下来,有一个按钮可以导航到另一个片段,但是如果我返回到已经有失败意图的结果的上一个屏幕,它会再次显示 Toast。这正是我想要弄清楚的。如果我已经收集了结果并将消息显示给用户,我不想继续这样做。如果我导航到另一个屏幕并返回(当应用程序从后台返回时也会发生这种情况,它会再次收集最后一个值)。LiveData 并没有发生这个问题,我只是做了同样的事情,

代码:

然后在我的片段中:

launchAndRepeatWithViewLifecycle 扩展功能:

关于为什么会发生这种情况以及如何使用 StateFlow 解决它的任何想法?我也尝试使用带有 replay = 0 的 SharedFlow 和带有 receiveAsFlow() 的 Channels,但随后出现了其他问题。

0 投票
1 回答
486 浏览

android - LiveData 是热的还是冷的?

我们知道 StateFlow 和 SharedFlow 很热门。

StateFlow 是一个热流——只要该流被收集或当垃圾收集根中存在对它的任何其他引用时,它就会保留在内存中。

SharedFlow 是一个热流,它向从它收集的所有消费者发出值。

流动本身是冷的。

流是类似于序列的冷流......

我有一个找不到直接答案的问题。LiveData 是热的还是冷的?

0 投票
2 回答
356 浏览

kotlin - 如何使用 kotlin 协程创建轮询机制?

我正在尝试使用 kotlin 协程创建一个轮询机制,sharedFlow并希望在没有订阅者时停止并在至少有一个订阅者时激活。我的问题是,sharedFlow在这种情况下是正确的选择还是应该使用channel. 我尝试使用channelFlow,但我不知道如何关闭cancel块体外部的通道(不是工作)。有人可以帮忙吗?这是片段。