问题标签 [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.

0 投票
1 回答
734 浏览

kotlin - 流和通道流有什么区别?

我在下面有两个代码,结果对我来说看起来一样

flow和有什么区别channelFlow

0 投票
1 回答
2297 浏览

android - Kotlin Flows 地图

我有一个关于 kotlin 流合并的问题。见下文乐趣。

我需要返回模型列表的流程,但是当收藏流程发生更改时,我必须将每个模型标记或取消标记为收藏。你知道我该怎么做吗?

0 投票
1 回答
665 浏览

kotlin - 如何为 Kotlin Coroutines Flow 编写扩展函数/包装器?

我有使用callbackFlow这样的协程代码:

我想做的是包装以下内容,以便可以自动调用它,因为我在代码中有许多类似的功能:

我想包装一次awaitCloseflowOn,而不必为每个callbackFlow编写它。你知道我可以使用哪个 Kotlin 高阶构造来实现这一点吗?

谢谢你,伊戈尔

0 投票
1 回答
432 浏览

android - 如何实现在 Kotlin Flow 中返回另一个流的 RxJava2 的 onErrorResumeNext 对应项?

我想实现最后离线的方法Flow,如果失败,首先尝试从远程源获取数据,例如改造抛出网络异常,我想使用下面的代码从本地源获取数据

但它被异常卡住了

onResumeNext如果存储库函数是 Observerable ,那么像 RxJava 一样拥有任何 observable 的正确实现应该是什么?

0 投票
3 回答
6399 浏览

android - 获取 Flow 发出的最后一项并且不接收更新

在不接收更新的情况下获取流发出的最后一个元素的最佳方法是什么。

问题: 我使用流来观察某些共享偏好的变化,但有时我想知道该偏好的当前值。我总是使用两个函数,一个是观察流中的值,另一个是直接捕获数据,有没有办法只用观察者函数来归档相同的行为?

0 投票
2 回答
609 浏览

kotlin - 如何初始化一个通用声明的 Kotlin MutableStateFlow

我正在调查 Kotlin MutableStateFlow/StateFlow并希望MutableStateFlow在通用基类中声明 my ,如下所示:-

我坚持的问题是 MutableStateFlow 有一个强制性的初始值。

我看不到如何提供类型“ S”的通用初始值

是否可以使用这种使用通用基类实例变量的方法?

0 投票
1 回答
454 浏览

android - 带有 Kotlin StateFlow 的 TextField

我想TextField绑定到MutableStateFlow来自视图模型的 a 。这就是我的设置方式:

当我在文本字段中输入内容时,它的行为非常奇怪。例如,如果我输入“asd”,它会以“asdasa”结尾。如何在textFlow.value不弄乱文本字段的情况下进行更新?

0 投票
1 回答
1247 浏览

kotlin - 在 Swift 中使用协程流

我们目前如何从 swift收集流量?

随着对Swift流方法中对 Kotlin 的挂起函数的新支持,collect在 swift 中获得了这个相当笨拙的签名

知道如何使用它,或者即使当前支持它的使用?

0 投票
1 回答
115 浏览

kotlin - 如何在不使用异常的情况下为 Flow 提供“关闭原因”?

假设我正在生成一个有限的消息流作为Flow<Message>. 我遍历一些消息源,当没有更多消息时,跳出循环以正常完成流程。

消费者只需调用collect以依次接收每条消息,直到流程完成。

但是当我需要告诉调用者为什么流程停止时会发生什么?例如,假设消息生产者需要身份验证,而我必须处理令牌到期。现在有两个原因可能会终止流程,所以我的生产者看起来像这样:

问题在于消费者不知道流程为何结束。消息只是用完了,还是需要重新验证并继续获取消息?现在,我可以想到两种可能的方法来处理它,我都不喜欢这两种方法。

例外

一个简单的解决方案是用异常发出“异常”流终止信号,如下所示:

太好了,因为现在消费者可以使用try/catch来确定流程终止的原因:

但是使用这样的异常绝对不是我想做的事情。在他关于Kotlin 和 Exceptions的文章中,Kotlin 库负责人 Roman Elizarov 明确告诉我们:

不要使用异常来返回结果值,[并且]避免try/catch在一般应用程序代码中。

这是一篇很棒的文章,我同意它的原因有很多,但是不想使用异常的一个关键原因是它引入了未经类型检查的行为。如果我使用 my AuthenticationExpiredException,那么在不阅读代码的情况下,流程的调用者不知道他们必须捕获并处理它。try没有/ ,代码将编译得很好catch,并且在运行时会失败。这是 Kotlin 中有意的语言设计选择:在编译时不检查异常,因为它们根本不打算以这种方式使用。

密封类

在 Kotlin 的其他地方返回不同类型的结果的一个好方法是使用密封类。所以我可能会写这样的东西:

这要好得多,因为现在两个可能的密切原因被平等对待。消费者可以使用一个when块来处理不同的结果,如果它们不包含处理AuthenticationExpired.

这种方法的问题是我无法强制执行“失败”结果必须始终是流程中的最后一项的规则。例如,假设我犯了一个错误,不小心错过了break循环中的 。

现在我将最终发出AuthenticationExpired值而不实际终止流。它只会继续发送消息。这可能会导致各种错误和安全问题,但它会编译得很好。


感觉我真正在寻找的是一种collect可以返回值的机制,如下所示:

有没有办法可以实现这样的目标?还是有另一种方法可以解决我所描述的问题?

0 投票
0 回答
682 浏览

kotlin - 如何在 RoomDb 调用后立即取消订阅协程流

我正在尝试查询 Room 数据库(操作 1),然后根据返回的结果在同一张表上执行另一个操作。但是我注意到每次执行第二个操作时,协程都会查询数据库(操作 1)。但这不是我想要的。举个例子:

我的物品道:

例如我想先执行selectItems(),如果列表为空立即调用insertItem(item)

但是在itemDao.insertItem(item)它再次显示日志消息之后。即使我itemDao.insertItem(item)再次从另一个方法调用它也会显示日志消息。有没有办法在收集后立即取消订阅协程?