更新视图模型的 MutableStateFlow、_uiState.update{} 或 _uiState.value = _uiState.value.copy() 哪个更好?

问题描述 投票:0回答:4

我很困惑该使用什么,是使用更新还是复制来更改/更新 Jetpack Compose 中的 UI 状态。

有人说用

_uiState.update {
    it.copy()
}

有人说用

_uiState.value = _uiState.value.copy()

使用哪一种更好?为什么?

我已经使用了

copy()
很多次,但我仍然不确定我是否有效或正确地更新了uiState。

android kotlin android-jetpack-compose android-viewmodel mutablestateflow
4个回答
3
投票

实际上 _uiState.update { } 和 _uiState.value.copy() 对于更新状态都是有效的,但它们在最佳实践线程安全方面略有不同。

使用 _uiState.update { }

线程安全:它可以防止多个线程尝试同时更新状态,从而导致状态不一致的问题。

原子性:读取当前状态并一次性应用修改 操作。

使用_uiState.value.copy()

它本质上不是线程安全的。如果多个线程尝试同时更新 _uiState,可能会出现不一致。

这种方式在单线程场景下比较简单,在多线程环境下一般安全性较差,很容易出现在后台线程、协程中

那么,您应该使用哪一种以及何时使用

更喜欢 _uiState.update { }: 在大多数情况下,处理 MutableStateFlow 时最好使用 update { },因为它是线程安全且原子的。它将保护 UI 状态免受竞争条件的影响,并且即使在多线程环境中也能确保一致的更新。

使用 _uiState.value.copy() -> 非常小心:如果您确定没有其他线程会同时修改状态,单线程环境,这可能没问题。


0
投票

我想说这两种方式都是有效的。这两种方法之间的核心区别是线程安全。

update
函数以原子方式执行修改,这意味着它确保不能有两个线程同时写入同一个
MutableStateFlow
。因此,当您从两个不同的地方异步更新
MutableStateFlow
时,您一定应该使用它,否则一些更新可能会丢失。

使用其值的指定函数以原子方式更新

MutableStateFlow.value

另请参阅这篇文章,其中指出了同时更新

MutableStateFlow
的危险。

否则,如果您没有同时修改 MutableStateFlow,则使用

value
字段和
copy
函数就足够了,并且比
update
更便宜(尽管差异可能并不显着)。


0
投票

这只能通过 StateFlow 实现。

而且,请注意,它不一定与 Compose 有关,它是 kotlin 协程的东西。

您可以使用任何一种方法 -

  • stateflow.update {...}
    是一种执行某些操作的原子方法,并且仅发出一个状态更新

  • stateflow.value = x
    基本相同,但它为您的流程分配了一些新值。

如果您不使用以前的状态(即,您不需要在状态更新中使用

copy
),则使用
stateflow.value
,但如果您想从旧状态创建新状态,则使用
stateflow.update {...}
而不是
copy

是有意义的

0
投票

虽然已经有多个答案解释了差异,但没有一个答案明确说明:

始终使用

value
属性。有一个例外:当 new 值的计算取决于 old 值时,您需要使用
update
方法。它效率较低,但这是保证并发更新不会丢失的唯一方法。

因此,请勿使用

_uiState.value.copy()

© www.soinside.com 2019 - 2024. All rights reserved.