gpt4 book ai didi

android - Jetpack 组合状态 : Modify class property

转载 作者:行者123 更新时间:2023-12-02 12:02:17 24 4
gpt4 key购买 nike

下面的两个示例只是将“a”添加到给定的默认值。 compose_version使用的是 1.0.0-alpha03这是今天最新的(据我所知)。
这个例子与我在研究中发现的大多数例子最相似。
示例 1

@Composable
fun MyScreen() {
val (name, setName) = remember { mutableStateOf("Ma") }

Column {
Text(text = name) // 'Ma'
Button(onClick = {
setName(name + "a") // change it to 'Maa'
}) {
Text(text = "Add an 'a'")
}
}
}
然而,这并不总是实用的。例如,数据比单个字段更复杂。例如一个类,甚至是 Room data class .
示例 2
// the class to be modified
class MyThing(var name: String = "Ma");


@Composable
fun MyScreen() {
val (myThing, setMyThing) = remember { mutableStateOf(MyThing()) }

Column {
Text(text = myThing.name) // 'Ma'
Button(onClick = {
var nextMyThing = myThing
nextMyThing.name += "a" // change it to 'Maa'
setMyThing(nextMyThing)
}) {
Text(text = "Add an 'a'")
}
}
}
当然, 示例 1 有效,但是 示例 2 才不是。这是我的一个简单错误,还是我错过了关于如何修改这个类实例的大图?
编辑:
我已经找到了一种方法来完成这项工作,但它似乎效率低下。然而,它确实与 React 管理状态的方式一致,所以也许它是正确的方法。
中的问题示例 2 很明显是 myNextThing不是原始 myThing 的副本,而是对它的引用。就像 React 一样,Jetpack Compose 在修改状态时似乎想要一个全新的对象。这可以通过以下两种方式之一完成:
  • 创建 MyThing 的新实例类,更改需要更改的内容,然后调用 setMyThing()使用新的类实例
  • 更改 class MyThingdata class MyThing并使用 copy()函数创建一个具有相同属性的新实例。然后,更改所需的属性并调用 setMyThing() .鉴于我明确表示我想用它来修改给定 data class 上的数据,这是就我的问题而言的最佳方法。由 Android Room 使用。

  • 示例 3 (功能性)
    // the class to be modified
    data class MyThing(var name: String = "Ma");


    @Composable
    fun MyScreen() {
    val (myThing, setMyThing) = remember { mutableStateOf(MyThing()) }

    Column {
    Text(text = myThing.name) // 'Ma'
    Button(onClick = {
    var nextMyThing = myThing.copy() // make a copy instead of a reference
    nextMyThing.name += "a" // change it to 'Maa'
    setMyThing(nextMyThing)
    }) {
    Text(text = "Add an 'a'")
    }
    }
    }

    最佳答案

    好的,所以对于任何想知道这一点的人来说,有一种更简单的方法可以解决这个问题。当您像这样定义可变状态属性时:

    //There is a second paremeter wich defines the policy of the changes on de state if you
    //set this value to neverEqualPolicy() you can make changes and then just set the value
    class Vm : ViewModel() {
    val dummy = mutableStateOf(value = Dummy(), policy= neverEqualPolicy())

    //Update the value like this
    fun update(){
    dummy.value.property = "New value"
    //Here is the key since it has the never equal policy it will treat them as different no matter the changes
    dummy.value = dummy.value
    }
    }
    有关可用政策的更多信息:
    https://developer.android.com/reference/kotlin/androidx/compose/runtime/SnapshotMutationPolicy

    关于android - Jetpack 组合状态 : Modify class property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63956058/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com