在Jetpack Compose应用程序中,我有两个类似以下内容的组合:

@Composable
fun Main() {
    println("Composed Main")
    val context = LocalContext.current

    var text by remember { mutableStateOf("") }

    fun update(num: Number) {
        text = num.toString()
        Toast.makeText(context, "Toast", Toast.LENGTH_SHORT).show()
    }

    Column {
        Text(text)
        Keypad { update(it) }
    }
}

@Composable
fun Keypad(onClick: (Number) -> Unit) {
    println("Composed Keypad")

    Column {
        for (i in 1..10) {
            Button(onClick = {onClick(i)}) {
                Text(i.toString())
            }
        }
    }
}

单击每个按钮会使两个可组合对象重新组合,并生成以下输出:

I/System.out: Composed Main
I/System.out: Composed Keypad

重新组合Keypad个Composable是不必要的,而且会使应用程序冻结(在更大的项目中会冻结几秒钟).

删除事件句柄中上下文的用法(在这里,注释掉Toast)可以解决问题,并且不会重新组合Keypad并生成以下输出:

I/System.out: Composed Main

有没有其他方法可以在不引起不必要的重组的情况下在事件中使用上下文?

推荐答案

这实际上很奇怪,为什么Toast在上映时会影响KeyPad的重组,但考虑到Toast是一种副作用,而不是Composable的实际部分(我希望在这里进行更正),我想把它放在Effect分,以防止Keypad重组,结果的确如此.

在这里,SideEffect将执行每一次重组后的工作.

SideEffect {
   if (text.isNotEmpty()) {
       Toast.makeText(context, "Toast", Toast.LENGTH_SHORT).show()
   }
}

或者,您可以使用text作为其关键字来使用LaunchedEffect,因此在随后的重新组合中,当text与其先前的值(无效)不同时,LaunchedEffect将重新执行并再次显示祝wine 词

LaunchedEffect(key1 = "text") {
   if (text.isNotEmpty()) {
       Toast.makeText(context, "Toast", Toast.LENGTH_SHORT).show()
   }
}

将打印替换为Log语句,这是单击任何按钮时的输出,所使用的效果之一

E/Composable: Composed Main   // first launch of screen
E/Composable: Composed Keypad // first launch of screen

// succeeding clicks

E/Composable: Composed Main
E/Composable: Composed Main
E/Composable: Composed Main
E/Composable: Composed Main

Android相关问答推荐

带有kSP而不是kapt的Hilt

如何清除导航抽屉中以前 Select 的项目(Jetpack Compose)

避免在按下肯定按钮时自动取消AlertDialog

Android 14上的慢速意图广播交付

有人能帮我在应用程序上使用模拟位置时避免被发现吗?我已经反编译并粘贴了一个代码,S小文件

在Jetpack Compose中的隐藏状态栏后面绘制

在Delphi中使用OpenCV for Android在使用JLIST时抛出错误

Jetpack Compose-如何在进入新产品线之前删除单词?

activity在 Runnable 中如何工作?我的 Android 表格未显示

将 React Native 应用程序背景带到前台

如何在 Jetpack Compose 中将文本绘制在另一个对象的中心?

从 HiltViewModel @Injection 访问 Application()

无法找到方法 ''java.io.File > org.jetbrains.kotlin.gradle.tasks.KotlinCompile.getDestinationDir()

如何在 Android Jetpack compose 中为列表初始填充设置动画

LazyColumn 单选中的状态提升. Jetpack compose

Android Jetpack Compose - 每次文本字段值更改时,可组合函数都会重新组合

Delphi 11:以编程方式查找 MSBuild 的正确工具版本

操作系统会终止已启动的服务并调用Service.onDestroy吗?

MpAndroidChart:在轴的末尾添加一个箭头

无法将片段中的 recyclerview 与适配器连接