问题标签 [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.
android - 如何使用 Kotlin 协程为 Android 单元测试注入 viewModelScope?
问题
viewModelScope使用 Kotlin 协程为 Android 单元测试注入的最佳策略是什么?当 CoroutineScope 被注入到 ViewModel 进行单元测试时,
flowOn即使在生产代码中不需要 CoroutineDispatcher 是否也应该被注入和定义?
flowOn在这个用例中,生产代码中不需要,因为 RetrofitDispatchers.IO在SomeRepository.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 更多
android - 类型不匹配推断类型为 () -> Unit 但 FlowCollector预计
当试图从 Flow 中收集时,类型突然不匹配,它正在工作,然后突然启动。
在我的视图模型中:
然后在我的活动中,我有以下内容:
但collect给出了错误:Type mismatch: inferred type is () -> Unit but FlowCollector<Int> was expected。
这怎么可能发生?
android - 带有 Kotlin Flow toList() 的 Android Room 库不起作用
我使用 Room 和 Flows 制作了一个简单的示例应用程序:
我想使用toList()上面代码中的函数,但是出了点问题,甚至 Log 也不打印。同时使用collect()效果很好,给了我所有的记录。
有人可以向我解释什么是错的吗?谢谢。
android - 使用 Kotlin Flow 测试 Android Room
我正在尝试测试一个RoomDAO 公开返回的函数Flows。以下测试不会通过,我正在努力寻找原因:
它没有assertEquals(2, outputList.size)说那outputList是空的。
该测试通过:
第二次测试通过,表明我的 DAO 工作正常,更多的是测试线程和Room用于触发Flow更改的线程之间的线程和并发问题。
我已经@get:Rule val archRule = InstantTaskExecutorRule()在我的测试中添加了。我还用这个构建我的测试数据库:
我错过了什么?
android - 为什么 CallbackFlow 在主线程上运行
我在代码中使用回调流从 Firebase 数据库中检索数据。这是我的代码
数据正在检索,但它正在主线程上运行。我想在后台线程上运行它。这怎么可能?。告诉我任何人
android - 从 androidx 使用 Paging 3 时出现“频道已关闭”消息
我试图在我的应用程序中将我的 Paging 2 实现转换为带有 Flow 的 Paging 3,但受到“通道已关闭”异常的困扰。该应用程序运行良好,但一段时间后崩溃(从几秒钟到几分钟)。它从网络加载数据,这可能很慢。使用 Room 作为内部数据库。模拟器上的崩溃比真实设备上的要频繁得多。
我对 Flow 不熟悉,我应该注意 Flow 系统中是否有任何已知的罪魁祸首?
你们中的任何其他人在使用 androidx 的 Paging 3 时遇到过类似的情况吗?
因此,如果这是一个已知问题(可能有明显的修复),请给我一个提示;与否,我可能会发布 Paging 3 代码部分(这需要一些时间)。
我的异常如下所示:
android - 合并多个 Flow> 单流
我正在尝试将来自 Room 数据库上不同 @Query 的多个 Flow 结果转换为这些结果列表的 Map Flow。像这样的东西:
我试着做这样的事情:
但显然这似乎行不通。任何想法我如何能做到这一点。提前谢谢了
kotlin - 使用 kotlin Flow 压缩下一个值
如何使用下一个值作为集合的 zipWithNext 运算符压缩流?
zipWithNext 的行为类似于:
但在我的情况下,字母是:
奖励积分:
flowOf(1, 2, 3).scan(emptyList<Int>()) { acc, value -> acc + value }.toList()我在https://play.kotlinlang.org/上试过,但没有找到flowOf什么导入,否则我在那里失踪了?
kotlin - 如何在 Kotlin 中创建具有少量订阅的流?
我需要运行一个任务,它会发出一些数据。我想订阅这些数据,例如 PublishSubject。但是我无法解决单实例流的问题。如果我再次尝试调用它,它将创建另一个实例,并且该工作将完成两次。我尝试在内部运行流程并将值发布到 BroadcastChannel,但这个解决方案似乎不正确。这种任务的最佳实践是什么?