在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相关问答推荐

Android深度链接配置中的URL片段匹配'

滑动以更改合成中的活动

从单元测试访问RES/RAW文件

原始mp3文件不显示与proguard

Android Kotlin ImageView内置于Kotlin ImageView中.适配器未按预期更新

如何防止在Android Studio中设置kotlin断点时优化变量

LaunchedEffect没有延迟时应用程序崩溃

布局可组合项如何具有可测量和约束参数?

通过 setIntentScanningStrategyEnabled(true) 未检测到信标的 Android Beacon 库后台扫描

在一个函数中组合相同的流 struct

在 Material 3 TopAppBar 代码的哪个位置定义了填充?

Android工作室未成立

如何在 JetpackCompose 的 LazyColumn 中 Select 多个项目

Android Transitions API - 在 24-48 小时后停止接收任何更新

如何只允许拖动 BottomSheetScaffold 中 BottomContent 的 SheetPeek 的一部分?

如何在 Jetpack Compose 中为中心对齐设置动画?

在jetpack compose中将图像添加到脚手架顶部栏

预览必须是顶级声明或具有默认构造函数的顶级类

在 Room 中创建一对多关系时,@Relation 类是什么意思?

多个项目 react-native android 构建错误