问题标签 [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 回答
4998 浏览

kotlin-flow - kotlin flow 没有从不同的函数发出值

我正在尝试实现 kotlin stateflow,但无法知道它不起作用的原因。

当前输出:验证34567

预期输出:验证 34567 验证失败

}

}

试图从这些链接中理解概念, Link1 Link2

0 投票
1 回答
5009 浏览

android - 如何使用 Kotlin 协程为 Android 单元测试注入 viewModelScope?

问题

  1. viewModelScope使用 Kotlin 协程为 Android 单元测试注入的最佳策略是什么?

  2. 当 CoroutineScope 被注入到 ViewModel 进行单元测试时,flowOn即使在生产代码中不需要 CoroutineDispatcher 是否也应该被注入和定义?

flowOn在这个用例中,生产代码中不需要,因为 RetrofitDispatchers.IOSomeRepository.kt中处理线程,并在默认情况下viewModelScope返回数据。Dispathers.Main

预期的

对保存在 Kotlin Flow 值中的 Android 的 ViewModel 视图状态值运行单元测试。

观察到的

带有主调度程序的模块未能初始化。对于测试,可以使用来自 kotlinx-coroutines-test 模块的 Dispatchers.setMain

单元测试在 CoroutineScope 被硬编码的第一次出现时失败。viewModelScope被利用,以便启动的协程将维持 ViewModel 的生命周期。但是,viewModelScope它是从 ViewModel 内部创建的,与可以在 ViewModel 外部定义并作为参数传入的 CoroutineDispatcher 相比,这使得注入更加复杂。

执行

SomeViewModel.kt

SomeTest.kt

注意:最终版本中将使用 JUnit 5 测试扩展。

完整的错误日志

线程“main @coroutine#1”java.lang.IllegalStateException 中的异常:带有 Main 调度程序的模块未能初始化。对于测试,来自 kotlinx-coroutines-test 模块的 Dispatchers.setMain 可以在 kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.missing(MainDispatchers.kt:113) 在 kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.isDispatchNeeded(MainDispatchers.kt:91) 上使用kotlinx.coroutines.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:285) at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:26) at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:109) at kotlinx.coroutines .AbstractCoroutine.start(AbstractCoroutine.kt:158) at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders. 68)在 com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) 在 com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230) 在 com.intellij.rt.junit .JUnitStarter.main(JUnitStarter.java:58) 原因:java.lang.RuntimeException:android.os.Looper 中的方法 getMainLooper 未模拟。看http://g.co/androidstudio/not-mocked详情。在 android.os.Looper.getMainLooper(Looper.java) 在 kotlinx.coroutines.android.AndroidDispatcherFactory.createDispatcher(HandlerDispatcher.kt:55) 在 kotlinx.coroutines.android.AndroidDispatcherFactory.createDispatcher(HandlerDispatcher.kt:52) 在 kotlinx。 coroutines.internal.MainDispatchersKt.tryCreateDispatcher(MainDispatchers.kt:57) at kotlinx.coroutines.test.internal.TestMainDispatcher.getDelegate(MainTestDispatcher.kt:19) at kotlinx.coroutines.test.internal.TestMainDispatcher.getImmediate(MainTestDispatcher.kt: 32) 在 androidx.lifecycle.ViewModelKt.getViewModelScope(ViewModel.kt:42) ... 40 更多线程“main @coroutine#1”java.lang.IllegalStateException 中的异常:主调度程序的模块未能初始化。用于测试调度程序。com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58) 上的 prepareStreamsAndStart(JUnitStarter.java:230) 原因:java.lang.RuntimeException:android.os.Looper 中的方法 getMainLooper 未模拟。看http://g.co/androidstudio/not-mocked了解详情。在 android.os.Looper.getMainLooper(Looper.java) 在 kotlinx.coroutines.android.AndroidDispatcherFactory.createDispatcher(HandlerDispatcher.kt:55) 在 kotlinx.coroutines.android.AndroidDispatcherFactory.createDispatcher(HandlerDispatcher.kt:52) 在 kotlinx。 coroutines.internal.MainDispatchersKt.tryCreateDispatcher(MainDispatchers.kt:57) at kotlinx.coroutines.test.internal.TestMainDispatcher.getDelegate(MainTestDispatcher.kt:19) at kotlinx.coroutines.test.internal.TestMainDispatcher.getImmediate(MainTestDispatcher.kt: 32) 在 androidx.lifecycle.ViewModelKt.getViewModelScope(ViewModel.kt:42) 在 app.topcafes.feed.viewmodel.FeedViewModel.bindIntents(FeedViewModel.kt:38) ... 39 更多

0 投票
3 回答
2939 浏览

android - 类型不匹配推断类型为 () -> Unit 但 FlowCollector预计

当试图从 Flow 中收集时,类型突然不匹配,它正在工作,然后突然启动。

在我的视图模型中:

然后在我的活动中,我有以下内容:

collect给出了错误:Type mismatch: inferred type is () -> Unit but FlowCollector<Int> was expected

这怎么可能发生?

0 投票
4 回答
2941 浏览

android - 带有 Kotlin Flow toList() 的 Android Room 库不起作用

我使用 Room 和 Flows 制作了一个简单的示例应用程序:

我想使用toList()上面代码中的函数,但是出了点问题,甚至 Log 也不打印。同时使用collect()效果很好,给了我所有的记录。

有人可以向我解释什么是错的吗?谢谢。

0 投票
1 回答
601 浏览

android - 使用 Kotlin Flow 测试 Android Room

我正在尝试测试一个RoomDAO 公开返回的函数Flows。以下测试不会通过,我正在努力寻找原因:

它没有assertEquals(2, outputList.size)说那outputList是空的。

该测试通过:

第二次测试通过,表明我的 DAO 工作正常,更多的是测试线程和Room用于触发Flow更改的线程之间的线程和并发问题。

我已经@get:Rule val archRule = InstantTaskExecutorRule()在我的测试中添加了。我还用这个构建我的测试数据库:

我错过了什么?

0 投票
1 回答
866 浏览

android - 为什么 CallbackFlow 在主线程上运行

我在代码中使用回调流从 Firebase 数据库中检索数据。这是我的代码

数据正在检索,但它正在主线程上运行。我想在后台线程上运行它。这怎么可能?。告诉我任何人

0 投票
0 回答
747 浏览

android - 从 androidx 使用 Paging 3 时出现“频道已关闭”消息

我试图在我的应用程序中将我的 Paging 2 实现转换为带有 Flow 的 Paging 3,但受到“通道已关闭”异常的困扰。该应用程序运行良好,但一段时间后崩溃(从几秒钟到几分钟)。它从网络加载数据,这可能很慢。使用 Room 作为内部数据库。模拟器上的崩溃比真实设备上的要频繁得多。

我对 Flow 不熟悉,我应该注意 Flow 系统中是否有任何已知的罪魁祸首?

你们中的任何其他人在使用 androidx 的 Paging 3 时遇到过类似的情况吗?

因此,如果这是一个已知问题(可能有明显的修复),请给我一个提示;与否,我可能会发布 Paging 3 代码部分(这需要一些时间)。

我的异常如下所示:

0 投票
1 回答
1967 浏览

android - 合并多个 Flow> 单流>>

我正在尝试将来自 Room 数据库上不同 @Query 的多个 Flow 结果转换为这些结果列表的 Map Flow。像这样的东西:

我试着做这样的事情:

但显然这似乎行不通。任何想法我如何能做到这一点。提前谢谢了

0 投票
1 回答
300 浏览

kotlin - 使用 kotlin Flow 压缩下一个值

如何使用下一个值作为集合的 zipWithNext 运算符压缩流?

zipWithNext 的行为类似于:

但在我的情况下,字母是:

奖励积分:

flowOf(1, 2, 3).scan(emptyList<Int>()) { acc, value -> acc + value }.toList()我在https://play.kotlinlang.org/上试过,但没有找到flowOf什么导入,否则我在那里失踪了?

0 投票
1 回答
53 浏览

kotlin - 如何在 Kotlin 中创建具有少量订阅的流?

我需要运行一个任务,它会发出一些数据。我想订阅这些数据,例如 PublishSubject。但是我无法解决单实例流的问题。如果我再次尝试调用它,它将创建另一个实例,并且该工作将完成两次。我尝试在内部运行流程并将值发布到 BroadcastChannel,但这个解决方案似乎不正确。这种任务的最佳实践是什么?