kotlin - 撰写导航后退按钮未显示

标签 kotlin android-jetpack-compose jetpack-compose-navigation

我正在尝试设置此后的导航后退按钮 SO thread ,但无法使其工作。

@ExperimentalFoundationApi
@Composable
fun LazyVerticalGridActivityScreen() {
    val navController = rememberNavController()

    val navigationIcon: (@Composable () -> Unit)? =
        if (navController.previousBackStackEntry != null) {
            {
                IconButton(onClick = { navController.popBackStack() }) {
                    Icon(imageVector = Icons.Filled.ArrowBack, contentDescription = null)
                }
            }
        } else {
            null
        }

    Scaffold(
        topBar = {
            TopAppBar(title = { Text("Lazy Vertical Grid") }, navigationIcon = navigationIcon)
        },
        content = {
            NavHost(navController = navController, startDestination = "home") {
                composable("home") { HomeScreen(navController) }
                composable("details/{listId}") { backStackEntry ->
                    backStackEntry.arguments?.getString("listId")
                        ?.let { DetailsScreen(it, navController) }
                }
            }
        }
    )
}

有人可以帮忙解决这个问题吗?谢谢!

最佳答案

更改 navController 状态不会使其容器重新组合,这就是此 navigationIcon 保持 null 的原因。

要使其重新组合,您需要使用addOnDestinationChangedListener:

var canPop by remember { mutableStateOf(false) }

DisposableEffect(navController) {
    val listener = NavController.OnDestinationChangedListener { controller, _, _ ->
        canPop = controller.previousBackStackEntry != null
    }
    navController.addOnDestinationChangedListener(listener)
    onDispose {
        navController.removeOnDestinationChangedListener(listener)
    }
}

val navigationIcon: (@Composable () -> Unit)? =
    if (canPop) {
        {
            IconButton(onClick = { navController.popBackStack() }) {
                Icon(imageVector = Icons.Filled.ArrowBack, contentDescription = null)
            }
        }
    } else {
        null
    }
...

关于kotlin - 撰写导航后退按钮未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68700884/

相关文章:

kotlin.UninitializedPropertyAccessException : lateinit property salesGST has not been initialized

Android Kotlin Retrofit + SimpleXMLConverter ElementList 无法正确解析

android - 如何绘制内边框?

android - Jetpack compose navigation popUpTo inclusive true 未从 backstack 清除可组合屏幕

jetpack-compose-navigation - Jetpack Compose Navigation 如何记住多个后堆栈?

kotlin - Kotlin:断言不变性

android - Kotlin Flow 如何组合两个流并仅在第一个流发送元素时发出结果

android - 将框/列与屏幕底部对齐 Jetpack Compose

kotlin - 如何在 Jetpack Compose 中启动和停止动画

android - Jetpack Compose Navigation 无限加载屏幕