问题标签 [kotlin-flow]
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.
kotlin - Kotlin Flow 的 GroupBy 运算符
我正在尝试从 RxJava 切换到 Kotlin Flow。流量确实令人印象深刻。但是现在kotlin Flow中有没有类似RxJava的“GroupBy”的操作符呢?
android - Kotlin Flow 与 Android LiveData
我对Kotlin Flow有一些疑问
- 我可以
LiveData
从多个片段中观察。我可以这样做Flow
吗?如果是,那怎么办? - 我们可以
LiveData
从一个LiveData
使用map
&获得多个switchMap
。有没有办法Flow
从单一来源获得多个Flow
? - 使用
MutableLiveData
我可以使用变量引用从任何地方更新数据。有没有办法做同样的事情Flow
?
我有一个用例,例如:我将观察一个SharedPreferences
使用callbackFlow{...}
它会给我一个单一的源流。从该流中,我想为每个键值对创建多个流。
这些可能听起来很愚蠢的问题。我是 Rx 和 Flow 世界的新手。
kotlin - Kotlin Flow onBackpressureDrop RxJava2 模拟
在 RxJava 2 Flowable 中有不同的背压策略,其中最有趣的是:
- 最新的
- 缓冲
- 降低
在整个 Rx 链中都受到尊重。
在 Kotlin 中有 Flow,它声明它具有开箱即用的背压支持。通过使用以下方法,我能够使 Flow 具有 BUFFER 和 LATEST 策略:
对于缓冲区:
最新:
这只是同一个缓冲区运算符的快捷方式。
但是我找不到任何可以与 DROP 一样工作的东西。简而言之,当先前的值尚未处理时,DROP 将删除流中的任何值。有了 Flow,我什至不确定这是否可能。
考虑案例:
因此,backpressureDrop 应该尊重在流中在下面完成的任何工作,而该操作员对下面发生的事情一无所知(没有来自底部的显式回调——比如 RxJava 订阅者中的“请求”方法)。因此,这似乎不太可能。在收集上一个项目之前,该操作员不应通过任何事件。
是否有任何我想念的现成运算符,或者是否有一种直接的方法可以用现有的 API 实现类似的东西?
android - 为什么 ConflatedBroadcacstChannel.asFlow() 不调用 Flow.onCompletion?
在Coroutines+Flow/LiveData 的新 Android 代码实验室中,您更新了 LiveData api 以使用 Flow,但我注意到一些onCompletion
未按预期调用的意外行为。我们要替换的 LiveData 代码:
我们在代码实验室结束时得到的 Flow 代码:
当您运行 Flow 时,微调器永远不会消失,因为即使mapLatest
转换完成,也不会调用 onCompletion。代码实验室指出,“onCompletion
每次上面的流程完成时都会调用它。它与 finally 块相同——它是放置清理期间需要执行的任何代码的好地方。这里我们正在重置微调器。”
但这显然不是真的。那么在每次转换后执行黑色代码的正确方法是什么,这是否意味着代码实验室不正确或者我有什么误解?
android - 带有房间和状态处理的 Kotlin Coroutines Flow
我正在尝试新的协程流程,我的目标是制作一个简单的存储库,可以从 web api 获取数据并将其保存到数据库,也可以从数据库返回一个流程。
我使用 room 和 firebase 作为 web api,现在一切看起来都很简单,直到我尝试将来自 api 的错误传递给 ui。
由于我从仅包含数据且不包含状态的数据库中获得了一个流,因此通过将其与 Web api 结果相结合来为其赋予状态(如加载、内容、错误)的正确方法是什么?
我写的一些代码:
道:
存储库:
Api 调用:
我希望问题足够清楚感谢您的帮助
编辑:由于问题不清楚,我会尽力澄清。我的问题是房间发出的默认流只有数据,所以如果我要订阅流,我只会收到数据(例如,在这种情况下,我只会收到用户列表)。我需要实现的是某种通知应用程序状态的方法,例如加载或错误。目前我能想到的唯一方法是包含状态的“响应”对象,但我似乎找不到实现它的方法。
就像是:
但是我遇到的一个明显问题是来自数据库的流是类型的Flow<List<UserPojo>>
,我不知道如何通过编辑流的状态来“丰富它”,而不会丢失来自数据库的订阅,也不会运行新的每次更新数据库时的网络调用(通过在地图转换中进行)。
希望它更清楚
asynchronous - 发生某些情况时如何停止 Kotlin 流程
如果代码中出现某些情况,我想取消 kotlin 流程。
假设我有一个方法如下
并称它为
问题是,如何在特定条件下(来自流程构建器或外部)停止流程以产生任何东西?
android - 如何使用 kotlin flow 实现完整的存储库
我正在尝试使用房间的新流支持和改造的协程支持来实现一个完整的存储库。我正在处理一些我似乎找不到解决方案的问题。
所以首先,让我们说明我到目前为止的位置。这是我的 ViewModel 类:
在这个类中,我创建了一个设置加载状态的流,从网络请求远程数据,当它获得结果时它订阅房间数据库并将自动从数据库返回的流转换为知道状态的流网络调用以及来自数据库的数据。
这有什么问题以及我似乎无法解决的问题是以下两个问题:
1)通过像这样构造我的代码,我必须等待网络响应才能发出任何数据。我想要实现的是从房间数据库返回流并显示旧数据,触发网络更新并用新数据更新 ui。但是我需要以这种方式构造我的代码,因为这是我能想到的唯一方法,它可以告诉 UI 网络调用是否失败。
2)此代码在技术上只能在第一次执行并且网络调用没有失败的情况下工作。如果我想手动触发更新,我不能,因为流仅在第一次收集(所以第一次执行)或房间数据库发出更改时运行(所以如果网络没有失败并且我将结果保存到D b)。
如果你需要它,repo 代码是这样的:
哪里remote.getInv()
只是一个改造挂起协程和 database.invDao() 是:
如果不是推荐的方法,我不需要将所有数据放在一个流中,我只需要知道使用带有流和改造协程的空间来实现一个好的存储库的正确方法是什么,并且拥有db 作为唯一的事实来源。
kotlin - 异常后如何恢复流程
我有以下代码:
如果fetchSomeData
因异常而失败,它将被捕获catch
并传递一些默认数据。问题是流程本身被取消并且正在从频道的订阅者中删除。这意味着提供给频道的任何新事件都将被忽略,因为不再有任何订阅者。
有没有办法确保在发生异常时流程不会被取消?
android - 流的乐趣,转换为实时数据时为空
我正在尝试流程并尝试查看如何使用 android 视图模型将它们转换为 mvvm。这是我首先尝试测试的内容:
我的阅读数字为空,但是有什么想法吗?
android - 如何使用 Kotlin Coroutines 使 setOnClickListener 去抖动 1 秒?
当用户快速点击按钮时,showDialog() 方法会在彼此的顶部显示多次,因此当您关闭它时,它后面会显示另一个。我正在寻找一种方法来忽略第二次点击 1 秒而不使用处理程序或检查前一次点击的时间。
我正在寻找使用 Kotlin 协程或 Kotlin 流的解决方案以用于未来的实现。