OnClick 多次执行函数

OnClick execute function multiple time

我正在尝试学习 Jetpack Compose,但我在导航方面遇到了一些困难,特别是我不明白为什么这段代码会打印两次“notwork”。

@Composable
fun NavigationController() {
    var navController = rememberNavController()
    NavHost(navController, startDestination = DummyRoutes.Dummy.route) {
        composable(route = DummyRoutes.Dummy.route) {
            Dummy(
                openHome = { navController.navigate(SomeRoutes.SomeOther.route) },
            )
        }
    }
}

@Composable
fun Dummy(
    openHome: () -> Unit,
) {

    Log.d("hello", "notwork: ")
    Button(onClick = {openHome()}) {
        
    }

可组合组件每次更改参数时都会重新组合。在您的情况下,它是 openHome。可能是在 NavigationController 中更改了 lambda。

Here 是一篇关于通过案例研究理解重组的有趣文章

NavHost 由于过渡动画而重新组合其目的地。

对于初始路线,它只会发生两次,但如果您尝试导航到另一个屏幕,两个 appearing/disappearing 屏幕都会有更多的重组。这是预期的行为。

如果您使用自己的动画,您的视图将每帧重新组合一次,这也可以。

有时您可以减少重组次数,例如当您使用经常变化的状态(如惰性列表状态)时,请查看 了解更多详情。

但是对于动画和导航你不能减少这个数字,你也不应该,因为屏幕实际上需要经常重绘。如果您构建得当 - 正确处理副作用,额外的重组不会影响您的应用程序性能。在 Thinking in Compose.

中查看有关重组和副作用的更多详细信息