问题标签 [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.

0 投票
1 回答
113 浏览

android - 我如何处理 MVI 架构中的两种方式绑定?

我看到许多文章处理与 MVVM 的两种方式绑定。但我想用单一的事实来源来处理这个问题。我不想为这种情况创建多个状态流。我有一个 StateFlow,它在实体内具有所有视图状态。我如何提供与多个 EditText 值同步到 StateFlow ?

我添加了多个 TextWatcher 来向 ViewModel 发送事件,但这种方式会导致样板代码。

0 投票
1 回答
765 浏览

android - 房间分页无法合并流程> 与其他流量正确

我正在尝试使用Paging 3库来获取Flow<PagingData<Scan>>Room然后检查是否在 recyclerview 中选择了项目,所以我将这个类映射到另一个名为ScanMapper. 为了实现这个映射,每当用户将一个项目标记为选中时,我都会MapMutableStateFlow<Map<Int, State>>. 这里Map查找 anIndex(Int)来获取State,State只是一个enum代表 State 的类UNINITIALISEDUSELECTEDand SELECTED

我将 Map 的值设置为StateFlow<Map<Int,State>>. 问题是,我试图将 与 结合起来Flow<PagingData<Scan>>StateFlow<Map<Int,State>>以便将 也State作为参数传递给ScanMapper类,因为它State取自StateFlow<Map<Int,State>>并且不是原始Scan类的一部分。但是,尽管我使用该功能在项目单击时将项目标记为已选中,但PagingDataAdapter似乎总是会出现这种情况。State UNINITIALISEDmarkSelected(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 中更新用户何时选择项目的方式。

然后,myFlowfragment像这样收集这个:

0 投票
1 回答
1153 浏览

android - 与 Livedata 不同,使用 Flow in Room 查询在更新表条目时不会触发刷新,但在我删除或插入条目时有效

当使用 Livedata 作为对 Room 中表的 select* 查询的返回类型时,我观察它,如果我更新/插入/删除该表中的条目,我会得到触发器。但是,当我尝试使用 Kotlin Flow 时,我只得到了 2 个触发器。

第一个触发器给出一个空值,因为状态流的初始值为空。第二个触发器是 Room 表中的条目列表。

如果我对数据库执行插入/删除操作,我会收到来自 StateFlow 的触发器。但是,如果我更新条目,Stateflow 不会触发。

注意:更新操作在数据库上正常工作。我使用数据库检查器进行了检查。

数据类 & DAO

视图模型

分段

0 投票
1 回答
301 浏览

android - 在使用 compose 创建应用程序时,此处使用的适当 Kotlin Flow 是什么?

以下是活动课。

视图模型是

我的视图状态由

并且事件类是

有了上述内容,我无法在单击按钮时更新我的​​ UI,我需要知道是否StateFlow是实现此目的的正确方法?

您可能会建议将其更改Event为以下

updateState()并将方法更新为

但我希望data成为mutable并更新state何时data更改。

谢谢

0 投票
1 回答
145 浏览

android - 从 launchWhenStarted 调用多个视图模型方法不起作用

此代码在同一视图模型上调用两个方法并侦听更新。但是只有第一个方法完成,第二个没有事件触发。

视图模型

但是,使用单独的生命周期范围调用它们是有效的

我似乎无法理解这种行为,有人知道为什么吗?

0 投票
1 回答
622 浏览

android - 一对 Fragment-ViewModel 的多个 LiveData/StateFlow

我有一个 Fragment,它代表单个活动应用程序中的一个屏幕,以及这个 Fragment 的 ViewModel。

ViewModel使用多个存储库从多个 API 调用中加载一组数据,并通过多个 StateFlow将该数据发送到片段。

假设片段有 2 个视图,每个视图都从与其相关的 StateFlow 中收集数据。直到所有 2 个视图都没有绘制它们的数据,我想显示一些进度条,然后当这些视图将接收数据时,将整个片段可见性从不可见变为可见。

我的问题是:当所有 2 个视图都收到数据时如何正确处理?

存储库:

视图模型:

分段:

0 投票
2 回答
90 浏览

kotlin - 暂停直到 StateFlow 达到所需状态之一并返回结果

考虑一个密封的类状态。

我有一个状态流,消费者可以在其中积极收听状态更新。

现在,我还想要一个简单的挂起方法,它会等待状态达到成功或失败,因此只需要结果一次的消费者不需要知道状态流。

如何做到这一点?

0 投票
0 回答
154 浏览

kotlin-coroutines - MutableStateFlow 无法收集流上发出的值

我正在尝试从flow.

视图模型

首页片段

在上面的示例中,MutableStateFlow未能发出某些事件。但是每次我delay(200)在连续发射之间放置一个,一切都会正常工作。

除非我错了,否则它应该按发射顺序发射所有事件。这是预期的行为吗?我错过了文档中的某些内容吗?还是我做错了什么?

0 投票
1 回答
417 浏览

android - 在有两个 StateFlow 观察者的生命周期范围内,只有第一个工作

在我看来,我不太明白一些事情。你能否向我解释为什么当我使用这个例子时,只有第一个集合对我有用。

或者如果我这样称呼他们:

但是如果我在不同的协程中调用它们,那么它们都可以工作,如下所示:

视图模型:

0 投票
2 回答
884 浏览

android - ui中再次收集StateFlow最后一个值

所以最近我一直在使用 StateFlow、SharedFlow 和 Channels API,但我在尝试将我的代码从 LiveData 迁移到表示层中的 StateFlow 时遇到了一个常见的用例。

我面临的问题是,当我发出数据并在 viewModel 中收集它时,我可以将值设置为 mutableStateFlow,当它最终到达片段时,它使用 Toast 显示一些信息性消息,让用户知道是否有错误发生或一切顺利。接下来,有一个按钮可以导航到另一个片段,但是如果我返回到已经有失败意图的结果的上一个屏幕,它会再次显示 Toast。这正是我想要弄清楚的。如果我已经收集了结果并将消息显示给用户,我不想继续这样做。如果我导航到另一个屏幕并返回(当应用程序从后台返回时也会发生这种情况,它会再次收集最后一个值)。LiveData 并没有发生这个问题,我只是做了同样的事情,

代码:

然后在我的片段中:

launchAndRepeatWithViewLifecycle 扩展功能:

关于为什么会发生这种情况以及如何使用 StateFlow 解决它的任何想法?我也尝试使用带有 replay = 0 的 SharedFlow 和带有 receiveAsFlow() 的 Channels,但随后出现了其他问题。