android - Jetpack 撰写 : MutableState<Boolean> not working as intended

标签 android kotlin state android-jetpack-compose

在我们的 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 }
}
第一个开关是可切换的,第二个不是:
first switch works, second one does not
我错过了什么? 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/

相关文章:

java - 如何隐藏弹出 Activity 的标题栏

android - Eclipse 找不到 Android 支持库

java - 有没有内置的图像识别功能

functional-programming - 如何从对象集合中提取Map,以键作为对象同一字段之一,并为实际对象赋值

javascript - 无法在其他函数中访问 this.state

javascript - 如何在 React (JSX) 中清除/重置状态内的数组

javascript - setState 在 componentDidMount() 中不起作用 - React

android - Gradle不适用于android studio 3.0

php - HttpURLConnection 从 .php 文件返回垃圾

kotlin 检查类型不兼容的类型