AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77736830
Accepted
Joris Wit
Joris Wit
Asked: 2023-12-31 01:34:20 +0800 CST2023-12-31 01:34:20 +0800 CST 2023-12-31 01:34:20 +0800 CST

为什么 Jetpack Compose 在 onTap 事件中使用旧状态

  • 772

我是 Kotlin 和 Jetpack Compose 的新手,我的 Android 应用程序遇到了问题。当我运行下面的代码时,我可以按“增加”按钮,画布上会显示增加的数字。但是,在这种pointerInput onTap情况下,该数字始终为 1。只有当我通过旋转设备强制重新组合时,才会使用新数字。

看起来好像是使用第一次合成时的状态而不是当前状态。如何使用onTap事件中的最新状态?

一些背景:我使用画布绘制具有动态数量的列和行的网格。我的示例中的数字决定了列数或行数。如果onTap我想计算单击了哪个单元格,以引发我自己的onCellTap事件。我通过使用公式来计算 中使用的单元格的位置来做到这一点onDraw,但相反。这一切都工作正常,直到动态添加列或行,因为我无法使用“旧”列计数进行计算。

mutableIntStateOf我在我的应用程序中使用了 a,而不是本示例中的 a ViewModel。为了简单起见,我从示例中删除了它,我希望这并不重要。

@Composable
fun TopLevelComposable(modifier: Modifier = Modifier) {

    var number by rememberSaveable { mutableIntStateOf(0) }

    Column {
        TestCanvasComposable(number)
        Button(onClick = {

            number += 1

        }) {
            Text(
                text = "Increase",
                modifier = modifier
            )
        }
    }
}

@Composable
fun TestCanvasComposable(
    number: Int,
    modifier: Modifier = Modifier
) {
    val textMeasurer = rememberTextMeasurer()
    Canvas(modifier = modifier
        .fillMaxWidth()
        .height(30.dp)
        .pointerInput(Unit) {
            detectTapGestures(
                onTap = {
                    // This does not show the correct number:
                    Log.i("Test", "The number is $number")
                }
            )
        }, onDraw = {
        drawRect(Color.Yellow, Offset.Zero, this.size)

        drawText(
            textMeasurer = textMeasurer,
            text = buildAnnotatedString {
                withStyle(ParagraphStyle(textAlign = TextAlign.Start)) {
                    // This works perfectly:
                    append("The number is: $number")
                }
            }
        )
    }
    )
}

我尝试删除TestCanvasComposable可组合项,然后将 Canvas 代码放入TopLevelComposable. 经过此更改后,它工作正常。但我想将它们分开以备重复使用。

android-jetpack-compose
  • 1 1 个回答
  • 31 Views

1 个回答

  • Voted
  1. Best Answer
    Chirag Thummar
    2023-12-31T13:19:34+08:002023-12-31T13:19:34+08:00

    您正在丢失状态,因为在@Composable重组时它会重置数字的值。

    您可以用来rememberUpdatedState跟踪号码的变化number和remember最后更新的号码。

    @Preview
    @Composable
    fun TopLevelComposable(modifier: Modifier = Modifier) {
    
        var number by rememberSaveable { mutableIntStateOf(0) }
    
        Column (modifier = Modifier.fillMaxSize()){
            TestCanvasComposable(number)
            Button(onClick = {
    
                number += 1
    
            }) {
                Text(
                    text = "Increase",
                    modifier = modifier
                )
            }
        }
    }
    
    @Composable
    fun TestCanvasComposable(
        number: Int,
        modifier: Modifier = Modifier
    ) {
        val num by rememberUpdatedState(newValue = number)
        val textMeasurer = rememberTextMeasurer()
        Canvas(modifier = modifier
            .fillMaxWidth()
            .height(30.dp)
            .pointerInput(Unit) {
                detectTapGestures(
                    onTap = {
                        // This does not show the correct number:
                        Log.i("Test", "The number is $num")
                    }
                )
            }, onDraw = {
            drawRect(Color.Yellow, Offset.Zero, this.size)
    
            drawText(
                textMeasurer = textMeasurer,
                text = buildAnnotatedString {
                    withStyle(ParagraphStyle(textAlign = TextAlign.Start)) {
                        // This works perfectly:
                        append("The number is: $num")
                    }
                }
            )
        }
        )
    }
    

    它正在工作检查此代码

    • 1

相关问题

  • 在 Jetpack Compose 中单独为每个字母设置动画时将画笔效果应用于整个单词

  • 将 StateFlow 设置为 null 时,Jetpack Compose 中的 Canvas 不清除绘制内容的问题

  • 如何在 Jetpack Compose 中制作钢琴音符?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve