问题标签 [kotlin-stateflow]
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 - 我如何处理 MVI 架构中的两种方式绑定?
我看到许多文章处理与 MVVM 的两种方式绑定。但我想用单一的事实来源来处理这个问题。我不想为这种情况创建多个状态流。我有一个 StateFlow,它在实体内具有所有视图状态。我如何提供与多个 EditText 值同步到 StateFlow ?
我添加了多个 TextWatcher 来向 ViewModel 发送事件,但这种方式会导致样板代码。
android - 房间分页无法合并流程> 与其他流量正确
我正在尝试使用Paging 3
库来获取Flow<PagingData<Scan>>
,Room
然后检查是否在 recyclerview 中选择了项目,所以我将这个类映射到另一个名为ScanMapper
. 为了实现这个映射,每当用户将一个项目标记为选中时,我都会Map
在MutableStateFlow<Map<Int, State>>
. 这里Map
查找 anIndex(Int)
来获取State
,State
只是一个enum
代表 State 的类UNINITIALISED
,USELECTED
and SELECTED
。
我将 Map 的值设置为StateFlow<Map<Int,State>>
. 问题是,我试图将 与 结合起来Flow<PagingData<Scan>>
,StateFlow<Map<Int,State>>
以便将 也State
作为参数传递给ScanMapper
类,因为它State
取自StateFlow<Map<Int,State>>
并且不是原始Scan
类的一部分。但是,尽管我使用该功能在项目单击时将项目标记为已选中,但PagingDataAdapter
似乎总是会出现这种情况。State UNINITIALISED
markSelected(scanId: Int)
请告诉我我在这里缺少什么。
更新
我能够通过使用 a 来实现我想要的功能,Flow<List<Scan>>
并Paging 3
使用带有DiffUtils
. 虽然这不是实际的解决方案,因为它消除了pagination using paging 3
库,但以下更改允许我执行项目选择:
更新道
ViewModel 中的更新功能
更新的片段代码
原始问题
我的扫描课:
我的 ScanMapper 类:
Scan 到 ScanMapper 的转换器,反之亦然
我在 Dao 中的 PagingSource
使用 getScansFlow() 获取流量
为 Room 中存在的 id 初始化 Map
ViewModel 中获取流并将它们组合起来的函数
myFlow
是一个StateFlow<PagingData<ScanMapper>?>
。
这就是我Map
在 recyclerview 中更新用户何时选择项目的方式。
然后,myFlow
我fragment
像这样收集这个:
android - 与 Livedata 不同,使用 Flow in Room 查询在更新表条目时不会触发刷新,但在我删除或插入条目时有效
当使用 Livedata 作为对 Room 中表的 select* 查询的返回类型时,我观察它,如果我更新/插入/删除该表中的条目,我会得到触发器。但是,当我尝试使用 Kotlin Flow 时,我只得到了 2 个触发器。
第一个触发器给出一个空值,因为状态流的初始值为空。第二个触发器是 Room 表中的条目列表。
如果我对数据库执行插入/删除操作,我会收到来自 StateFlow 的触发器。但是,如果我更新条目,Stateflow 不会触发。
注意:更新操作在数据库上正常工作。我使用数据库检查器进行了检查。
数据类 & DAO
视图模型
分段
android - 在使用 compose 创建应用程序时,此处使用的适当 Kotlin Flow 是什么?
以下是活动课。
视图模型是
我的视图状态由
并且事件类是
有了上述内容,我无法在单击按钮时更新我的 UI,我需要知道是否StateFlow
是实现此目的的正确方法?
您可能会建议将其更改Event
为以下
updateState()
并将方法更新为
但我希望data
成为mutable
并更新state
何时data
更改。
谢谢
android - 从 launchWhenStarted 调用多个视图模型方法不起作用
此代码在同一视图模型上调用两个方法并侦听更新。但是只有第一个方法完成,第二个没有事件触发。
视图模型
但是,使用单独的生命周期范围调用它们是有效的
我似乎无法理解这种行为,有人知道为什么吗?
android - 一对 Fragment-ViewModel 的多个 LiveData/StateFlow
我有一个 Fragment,它代表单个活动应用程序中的一个屏幕,以及这个 Fragment 的 ViewModel。
ViewModel使用多个存储库从多个 API 调用中加载一组数据,并通过多个 StateFlow将该数据发送到片段。
假设片段有 2 个视图,每个视图都从与其相关的 StateFlow 中收集数据。直到所有 2 个视图都没有绘制它们的数据,我想显示一些进度条,然后当这些视图将接收数据时,将整个片段可见性从不可见变为可见。
我的问题是:当所有 2 个视图都收到数据时如何正确处理?
存储库:
视图模型:
分段:
kotlin - 暂停直到 StateFlow 达到所需状态之一并返回结果
考虑一个密封的类状态。
我有一个状态流,消费者可以在其中积极收听状态更新。
现在,我还想要一个简单的挂起方法,它会等待状态达到成功或失败,因此只需要结果一次的消费者不需要知道状态流。
如何做到这一点?
kotlin-coroutines - MutableStateFlow 无法收集流上发出的值
我正在尝试从flow
.
视图模型
首页片段
在上面的示例中,MutableStateFlow
未能发出某些事件。但是每次我delay(200)
在连续发射之间放置一个,一切都会正常工作。
除非我错了,否则它应该按发射顺序发射所有事件。这是预期的行为吗?我错过了文档中的某些内容吗?还是我做错了什么?
android - 在有两个 StateFlow 观察者的生命周期范围内,只有第一个工作
在我看来,我不太明白一些事情。你能否向我解释为什么当我使用这个例子时,只有第一个集合对我有用。
或者如果我这样称呼他们:
但是如果我在不同的协程中调用它们,那么它们都可以工作,如下所示:
视图模型:
android - ui中再次收集StateFlow最后一个值
所以最近我一直在使用 StateFlow、SharedFlow 和 Channels API,但我在尝试将我的代码从 LiveData 迁移到表示层中的 StateFlow 时遇到了一个常见的用例。
我面临的问题是,当我发出数据并在 viewModel 中收集它时,我可以将值设置为 mutableStateFlow,当它最终到达片段时,它使用 Toast 显示一些信息性消息,让用户知道是否有错误发生或一切顺利。接下来,有一个按钮可以导航到另一个片段,但是如果我返回到已经有失败意图的结果的上一个屏幕,它会再次显示 Toast。这正是我想要弄清楚的。如果我已经收集了结果并将消息显示给用户,我不想继续这样做。如果我导航到另一个屏幕并返回(当应用程序从后台返回时也会发生这种情况,它会再次收集最后一个值)。LiveData 并没有发生这个问题,我只是做了同样的事情,
代码:
然后在我的片段中:
launchAndRepeatWithViewLifecycle 扩展功能:
关于为什么会发生这种情况以及如何使用 StateFlow 解决它的任何想法?我也尝试使用带有 replay = 0 的 SharedFlow 和带有 receiveAsFlow() 的 Channels,但随后出现了其他问题。