在我们的 Android 应用程序中,我们希望将 Compose 引入一个简单的调试屏幕,我们可以在其中启用/禁用 SharedPreferences。我正在尝试使用 Compose 的界面 MutableState
让它运行。 - 但它并不像我认为的那样起作用。我的计划是暂时使用MutableState
在 SharedPreferences 中设置一个 bool 值(在稍后迁移到 DataStore 之前)。
这是我的想法:
private class MyOwnState(startWith: Boolean) : MutableState<Boolean> {
override var value: Boolean = startWith
override fun component1(): Boolean = value
override fun component2(): (Boolean) -> Unit = { value = it }
}
// then, in composable:
var value by remember { MyOwnState(false) }
当然在现实生活中我会覆盖 value
的 getter+setter - 但是这个例子就足够了,因为它不起作用。状态更改不会传播,UI 也不会更新。为了说明这一点,我将代码 fragment
by remember { mutableStateOf(false) }
放在一起和 by remember { MyOwnState(false) }
.第一个有效(开关已更新),第二个无效。完整代码:
@Composable
fun SomeStateExamples() {
Column {
SwitchWorks()
SwitchDoesNotWork()
}
}
@Composable
fun SwitchWorks() {
var value by remember { mutableStateOf(false) }
Switch(checked = value, onCheckedChange = { value = it })
}
@Composable
fun SwitchDoesNotWork() {
var value by remember { MyOwnState(false) }
Switch(checked = value, onCheckedChange = { value = it })
}
private class MyOwnState(startWith: Boolean) : MutableState<Boolean> {
override var value: Boolean = startWith
override fun component1(): Boolean = value
override fun component2(): (Boolean) -> Unit = { value = it }
}
第一个开关是可切换的,第二个不是:我错过了什么?
MutableState
接口(interface)非常简单且稳定 - 我没有找到需要调用的任何额外方法(又名 invalidate、notifyListeners,...)。谢谢您的帮助! 🙏
最佳答案
添加到 Johan 的答案中,您似乎还需要实现 StateObject
获取值并更新 thd 快照系统。通过查看 SnapshotMutableStateImpl
override var value: T
get() = next.readable(this).value
set(value) = next.withCurrent {
if (!policy.equivalent(it.value, value)) {
next.overwritable(this, it) { this.value = value }
}
}
private var next: StateStateRecord<T> = StateStateRecord(value)
override val firstStateRecord: StateRecord
get() = next
您将看到使用 StateObject
让您与 StateRecord
合作s 存储可更新值的位置,读取并更新它。
关于android - Jetpack 撰写 : MutableState<Boolean> not working as intended,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70831350/