mutableStatof数据类不创建可复合的重新组合

发布于 2025-02-12 23:33:20 字数 1926 浏览 0 评论 0原文

我正在努力理解什么是使它起作用的最佳方法。 我有一些输入字段,我创建了一个TextFieldState,以将所有状态都放在一个地方。 但这并不是触发了合成的重新组合,因此状态永远不会更新。 我在一个类似的问题上看到了这个堆栈溢出的答案,但是我发现它令人困惑,这对我来说没有任何意义,

这是代码:

可理解:

@composable 有趣的addtrip( AddTripvm:addTripvm = HiltViewModel() ){

var name = addTripVm.getNameState()
var stateTest = addTripVm.getStateTest()

Column(
    //verticalArrangement = Arrangement.Center,
    modifier = Modifier
        .fillMaxSize()
) {
    Text(text = "Add Trip")
    Column(

    ){

        println("From Composable: ${name.value.value}") //No Recomposition
        meTextField(
            value = name.value.value,
            onChange = {
                addTripVm.updateName(it)
            },
            placeholder = "Name",
        )

}

查看模型代码:

@HiltViewModel
class AddTripVm @Inject constructor(
    private val tripRepository: TripRepositoryContract,
    private val tripValidator: TripValidatorContract
): TripValidatorContract by tripValidator,  ViewModel() {

    /**
     * Name of the trip, this is required
     */
    private val nameState: MutableState<TextFieldState> = mutableStateOf(TextFieldState())

    private var stateTest = mutableStateOf("");

    fun updateStateTest(newValue: String) {
        stateTest.value = newValue
    }

    fun getStateTest(): MutableState<String> {
        return stateTest
    }

    fun getNameState(): MutableState<TextFieldState> {
        return nameState;
    }

    fun updateName(name: String) {
        println("From ViewModel? $name") 
        nameState.value.value = name
        println("From ViewModel after update: ${nameState.value.value}") //Updates perfectly
    }

}

文本字段状态:

data class TextFieldState(
    var value: String = "",
    var isValid: Boolean? = null,
    var errorMessage: String? = null
)

这可能吗?还是我需要将值分为字符串,并将状态保留为是否有效?

I am struggling to understand what is the best way to get this to work.
I have some input fields and I created a TextFieldState to keep all the state in one place.
But it is not triggering a re-composition of the composable so the state never updates.
I saw this stack overflow answer on a similar question, but I just find it confusing and it doesn't make sense to me

Here is the code:

The Composable:

@Composable
fun AddTrip (
addTripVm: AddTripVm = hiltViewModel()
) {

var name = addTripVm.getNameState()
var stateTest = addTripVm.getStateTest()

Column(
    //verticalArrangement = Arrangement.Center,
    modifier = Modifier
        .fillMaxSize()
) {
    Text(text = "Add Trip")
    Column(

    ){

        println("From Composable: ${name.value.value}") //No Recomposition
        meTextField(
            value = name.value.value,
            onChange = {
                addTripVm.updateName(it)
            },
            placeholder = "Name",
        )

}

View Model code:

@HiltViewModel
class AddTripVm @Inject constructor(
    private val tripRepository: TripRepositoryContract,
    private val tripValidator: TripValidatorContract
): TripValidatorContract by tripValidator,  ViewModel() {

    /**
     * Name of the trip, this is required
     */
    private val nameState: MutableState<TextFieldState> = mutableStateOf(TextFieldState())

    private var stateTest = mutableStateOf("");

    fun updateStateTest(newValue: String) {
        stateTest.value = newValue
    }

    fun getStateTest(): MutableState<String> {
        return stateTest
    }

    fun getNameState(): MutableState<TextFieldState> {
        return nameState;
    }

    fun updateName(name: String) {
        println("From ViewModel? $name") 
        nameState.value.value = name
        println("From ViewModel after update: ${nameState.value.value}") //Updates perfectly
    }

}

Text field state:

data class TextFieldState(
    var value: String = "",
    var isValid: Boolean? = null,
    var errorMessage: String? = null
)

Is this possible? Or do I need to separate the value as a string and keep the state separate for if its valid or not?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

沦落红尘 2025-02-19 23:33:20

您不会将Namestate值的实例更改为

 nameState.value.value = name

相同的对象,该对象默认情况下

fun <T> structuralEqualityPolicy(): SnapshotMutationPolicy<T> =
    StructuralEqualityPolicy as SnapshotMutationPolicy<T>

private object StructuralEqualityPolicy : SnapshotMutationPolicy<Any?> {
    override fun equivalent(a: Any?, b: Any?) = a == b

    override fun toString() = "StructuralEqualityPolicy"
}

使用mutableState检查以

fun <T> mutableStateOf(
    value: T,
    policy: SnapshotMutationPolicy<T> = structuralEqualityPolicy()
): MutableState<T> = createSnapshotMutableState(value, policy)

最简单的方法是设置

nameState.value = nameState.value.copy(value= name)

其他选项是编写您自己的snapshotmuntionpolicy

You don't change instance of nameState's value with

 nameState.value.value = name

It's the same object which State checks by default with

fun <T> structuralEqualityPolicy(): SnapshotMutationPolicy<T> =
    StructuralEqualityPolicy as SnapshotMutationPolicy<T>

private object StructuralEqualityPolicy : SnapshotMutationPolicy<Any?> {
    override fun equivalent(a: Any?, b: Any?) = a == b

    override fun toString() = "StructuralEqualityPolicy"
}

MutableState use this as

fun <T> mutableStateOf(
    value: T,
    policy: SnapshotMutationPolicy<T> = structuralEqualityPolicy()
): MutableState<T> = createSnapshotMutableState(value, policy)

Easiest way is to set

nameState.value = nameState.value.copy(value= name)

other option is to write your own SnapshotMutationPolicy

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文