我们可以以类似的方式创建LiveData或StateFlow,如下所示
val _liveData = MutableLiveData(0)
val _stateFlow = MutableStateFlow(0)但是在LiveData中,我们可以通过使用
val _liveData: MutableLiveData<Int> = savedStateHandle.getLiveData("Key", 0)对于StateFlow,是否有一种方法(或API)来保留最后一个值并恢复它,就像我们在LiveData中所拥有的那样?
发布于 2021-12-22 06:40:42
我使用ViewModel中的传统方法来存储和恢复值
private val _stateFlow = MutableStateFlow(
savedStateHandle.get("key") ?: InitialValue
)以及在设置值时
_stateFlow.value = ChangeValue
savedStateHandle.set("key", ChangeValue)不太理想,但至少我们有办法保存最新的价值。
感谢https://www.reddit.com/user/coffeemongrul/,他提出了一项建议,按照https://www.reddit.com/r/androiddev/comments/rlxrsr/in_stateflow_how_can_we_save_and_restore_android/的要求用类来包装它
class MutableSaveStateFlow<T>(
private val savedStateHandle: SavedStateHandle,
private val key: String,
defaultValue: T
) {
private val _state: MutableStateFlow<T> =
MutableStateFlow(savedStateHandle.get<T>(key) ?: defaultValue)
var value: T
get() = _state.value
set(value) {
_state.value = value
savedStateHandle.set(key, value)
}
fun asStateFlow(): StateFlow<T> = _state
}发布于 2021-12-21 10:22:39
你能试试这个吗?我还没试过,但我想可能有用。
private val _stateFlow: MutableStateFlow<Int>?
get()= savedStateHandle.get<MutableStateFlow<Int>>("KEY")发布于 2022-08-07 13:00:47
我可以再提出一个解决方案。一个简单的扩展,一旦SavedStateHandle更新了MutableStateFlow,它就会被更新。
fun <T> SavedStateHandle.getMutableStateFlow(
scope: CoroutineScope,
key: String,
initialValue: T
): MutableStateFlow<T> {
return MutableStateFlow(get(key) ?: initialValue).apply {
scope.launch(Dispatchers.Main.immediate) {
this@apply.collect { value ->
set(key, value)
}
}
}
}https://stackoverflow.com/questions/70433526
复制相似问题