Jetpack Compose 记住关键字

问题描述 投票:0回答:1

我是使用 swiftui 的 iOS 开发人员。 现在我有一个android项目,所以我开始学习jetpack compose。

但是我下面有一个与 swiftui 状态不同的问题。

package com.example.myapplication

import androidx.compose.material3.Slider import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.tooling.preview.Preview import com.example.myapplication.ui.theme.MyApplicationTheme import kotlin.random.Random import kotlin.random.nextInt

@Composable fun MainScreen() {
    var sliderValue by remember { mutableStateOf(0.5f) }
    var targetValue: Int = Random.nextInt(0..100)

    Text(text = ("The Target score is $targetValue"))
    TargetSlider(value = sliderValue, changeValue = {value ->
        sliderValue = value
    }) }

@Preview(showBackground = true, showSystemUi = true) @Composable fun MainScreenPreview() {
    MyApplicationTheme {
        MainScreen()
    } }

我认为因为我没有将 targetValue 声明为记住,所以当我在实时预览中移动滑块时, Text(text = ("目标分数是 $targetValue") 中的 targetValue 不应该改变。

但是当我检查实时预览或运行应用程序时,每当我移动滑块时,滑块中的 $targetValue 都会发生变化......我无法理解。

我的想法: (1) 声明为“by Remember”的变量在更改时更新 UI。 (2) 何时调用 Random.nextInt() ?为什么每次移动滑块时 targetValue 都会改变..?

帮助

android-jetpack-compose
1个回答
0
投票

在 Jetpack Compose 中,我们有一个称为“重组”的概念。根据官方文档,重组定义如下:

重组是指 Jetpack Compose 重新执行可组合项 可能已经改变以响应状态变化,然后更新 反映任何变化的构图。

每当重新执行可组合项时,
所有未通过记住存储的状态都会丢失

。因此,您正在使用“记住”,以便通过重组保留一个值。 用线

var targetValue: Int = Random.nextInt(0..100)

此变量将在每次重组时重新创建。因此,每当您拖动滑块时,可组合项都会重新组合,并且会为变量分配新的随机值。这就是你正在经历的现象。

© www.soinside.com 2019 - 2024. All rights reserved.