sjo*_*son 3 android kotlin android-livedata kotlin-coroutines
在处理一个项目时,我们需要在视图模型中包含项目列表。该类型是自定义数据类。
到目前为止,我一直使用 aMutableLiveData来存储列表的状态。当用户扫描我们已连接到设备的 RFID 读取器上的物品时,该列表将会更新。扫描时,将从服务器获取项目,并且列表将相应更新。
我想尝试继续使用 aStateFlow来代替,但我在这里遇到了问题。
当扫描新项目时,我将使用该add命令更新可变列表,然后更新列表中的相应项目。这不会触发LiveData或StateFlow观察者/收集器 - 但LiveData我可以在完成更新后将列表分配给自身。( _listOfItems.value = _listOfItems.value) 因为这会通知观察者。
然而,这不起作用StateFlow,因为它仅在引用更改时触发(它不会,因为它是相同的列表,只是其中包含新的/更改的项目)。
我知道使用可变列表和协程更新同一列表可能存在一些问题,因为如果尝试同时更新列表或类似的情况可能会发生冲突。
因此,通常的问题是:当视图模型中有一个列表并在列表内容发生变化时更新 UI 时,最好的方法是什么?
在 StateFlow 中使用 MutableList 并使其更新是不可能的,因为 StateFlow 总是与前一个值进行相等比较,并且由于前一个值是同一列表的实例,因此它们将始终被视为相等。
您可以使用 SharedFlow 来完成这项工作,它不会与前一个值进行比较。
然而,一般来说,将可变类与 SharedFlow/StateFlow(甚至 LiveData)一起使用非常容易出错,因为数据可能从多个不同的位置读取和写入。非常难管理。
一种解决方案是每次将列表发送到流程时创建列表的副本:
myMutableStateFlow.value = myMutableList.toList()
Run Code Online (Sandbox Code Playgroud)
如果您想要更容易管理的代码(可能会以牺牲性能为代价),那么根本不要使用可变列表。使用只读列表。您可以将其放入var属性中,或者value直接修改 StateFlow 的属性。
myMutableStateFlow.value += someNewItems
// where myMutableStateFlow's type is a List, not MutableList
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4613 次 |
| 最近记录: |