问题标签 [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
我正在尝试测试一个Room
DAO 公开返回的函数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,但这个解决方案似乎不正确。这种任务的最佳实践是什么?