问题标签 [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 流转换在与另一个运算符后跟时不会发出结果
我有一个以下 Kotlin 流程,我需要做的是从 getUseCase.getResult() 发出值,然后启动另一个依赖于 getResults() 的流程并发出更多值。getContentUseCase.getContent().transform 中的代码按预期执行并发出值,但是 getUseCase.getResult().transform 中的值永远不会发出。
但是,当我删除 flatMapConcat 运算符及其内容时,我会获取从 getUseCase.getResult().transform 发出的值。不知道发生了什么,但我怎样才能在两个流程中进行工作发射?
android - 如何在 Android Worker 中完成 Kotlin Flow
我正在调查在我当前的 Android 应用程序中使用 Kotlin Flow
我的应用程序通过 Retrofit API 调用从远程服务器检索数据。
其中一些 API 在 500 个项目页面中返回 50,000 个数据项。
每个 API 响应都包含一个包含下一页完整 URL 的 HTTP 链接标头。
这些调用最多可能需要 2 秒才能完成。
为了减少经过的时间,我采用了 Kotlin Flow 来同时处理每一页数据,同时还进行下一页 API 调用。
我的流程定义如下:
我的递归函数定义如下,它获取所有页面:-
我的许多问题是
此代码不会插入我检索到的所有数据项
检索到所有数据项后如何完成流程
检索并保存所有数据项后,如何完成 GlobalScope 作业
更新
通过进行以下更改,我设法插入了所有数据
我不喜欢依赖 a CompletableDeferred
,有没有比这更好的方法来知道 Flow 什么时候完成了所有事情?
kotlin - MutableStateFlow 强制更新/通知收集器
MutableStateFlow
如果更新的值等于旧值(来源),则不会通知收集器。我找到了一种解决方法,但它不能很好地适应复杂的值。
解决方法:使用/复制数据类copy()
和列表。toList()
toMutableList()
示例 1:WorkoutRoutine
使用变通方法重命名的简单数据类name
。这里没有错。
示例 2:WorkoutRoutine
具有多个依赖项的复杂数据类,使用解决方法将 a 添加Set
到: 这需要大量的Exercise
and调用,这使得代码不可读。WorkoutRoutine
copy()
toMutableList()
我尝试了以下方法:
MutableStateFlow.valueNotDistinct
添加强制更新的扩展值MutableStateFlow.value
。
-> 问题:MutableStateFlow.value
必须可以为空
- 使用
MutableSharedFlow
不检查相等性
-> 问题:性能不高,没有value
属性
我想要的是在每次发射时简单地通知收集器,但我不知道该怎么做,因为 MutableStateFlow 似乎没有“强制通知”功能。
kotlin - 在 StateFlow 中操作集合的正确方法
我正在像这样创建 MutableStateFlow:
稍后我想在这个流程中更新集合:
这似乎不起作用(集合更新,但未通知观察者)。我发现它的工作方式:
但它会创建集合的副本,所以它看起来不适合我。有没有更简单的方法来更新 StateFlow 中的集合?
kotlin - 将两个状态流组合成新的状态流
我有两个状态流。是否可以将它们结合起来并获得新的状态流?从逻辑上讲,这应该是可能的,因为两个状态流都有初始值,但正如我所见,组合函数只返回 Flow 而不是 StateFlow。
kotlin - 更改 LiveData 的源流
我尝试在 repos 中使用 Flow 而不是 LiveData。在视图模型中:
存储库:
例如,如果 currCode 在 viewModel 的生命周期中始终相同,则它可以正常工作,euro
但是如果 currCode 更改为dollar
怎么办?
如何为另一个参数state
显示一个?Flow
android - StateFlow 收集发出 NullPointerException
我的存储库层有一个MutableStateFlow
,在我的 ViewModel 中收集它。我在一些用户设备上得到这个 NPE
MutableStateFlow
是非空数据,如果数据以某种方式为空,则应用程序会更早崩溃。
我如何StateFlow
在存储库(生产者)层上使用的示例:
ViewModel(消费者)方面:
状态流永远不会完成。对状态流的 Flow.collect 调用永远不会正常完成,由 Flow.launchIn 函数启动的协程也不会正常完成。
并且Flow 文档建议捕获这样的异常
那么是否建议吞下collect
a 中的所有异常StateFlow
或仅吞下生产者端抛出的异常?NPE的一般原因是什么?
kotlin - Kotlin Flow 的 Collect 是否只是内部 kotlinx.coroutines API?
以https://kotlinlang.org/docs/reference/coroutines/flow.html#flows-are-cold的直接示例
我得到了错误collect
。
当我添加@InternalCoroutinesApi
collect
我在的 lambda(的函数)中得到一个错误,value -> println(value
如下所示
我正在使用 Kotlin 版本 1.4.21。
我做错了什么无法在 Android Studio 中编译示例代码吗?
android - Android:在另一个不发射的情况下收集 Kotlin Flow
我有以下方法:
它在存储库中搜索调用search
返回Flow<List<JobEntity>>
. 然后对于JobEntity
流程中的每一个,我需要从数据库中获取该作业所属的类别。一旦有了该类别和作业,我就可以将作业转换为域模型对象 ( JobDomainModel
) 并将其添加到列表中,该列表将作为方法的返回对象在流中返回。
我遇到的问题是什么都没有发出。我不确定在 Kotlin 中使用流时是否遗漏了一些东西,但我没有通过 ID ( categoriesRepository.getCategoryById(jobEntity.categoryId)
) 获取类别,然后它可以正常工作并发出列表。
提前非常感谢!
android - Android Paging 3 库:如何使用新参数更改列表?
我有一个显示搜索项目列表的搜索片段。如果用户输入某些内容,我将该字符串作为新的查询参数传递给 url,并使用 paging 3 库获取新列表。
第一个解决方案是:
通过此解决方案,通过更改 url ( showPostList(newUrl)
,列表保持不变。可能在 viewModel 中使用缓存列表。
另一种解决方案是:使用片段showPostList(initUrl)
的in onViewCreated
,然后通过更改参数使用自爆方法:
这项工作,但如果旧列表和新列表有共同的项目,新的列表显示在最后一个共同的可见项目。例如,如果旧列表的第 5 位项目与新列表的第 7 位相同,则在列表更改以显示新列表后,它从第 7 位而不是第一项开始。
我在这里找到了另一个解决方案:
但是通过使用此列表刷新返回片段,有时Recyclerview
状态更改。