BackPressedDispatcher的正确用法

// callback 默认无效
private val showDialogBackPressedCallBack = object : OnBackPressedCallback(false) {
        override fun handleOnBackPressed() {
            showDialog()
        }
    }
//在dispatcher中注册callback
requireActivity().onBackPressedDispatcher.addCallback(this,showDialogBackPressedCallBack)
//使callback有效或无效
//此时当回调用的size大于0时此callback有效,等于0时则无效
showDialogBackPressedCallBack.isEnabled = size > 0

->不需要在activity.onBackPressed中再处理一次
注意,callback添加与处理顺序类似堆栈,先添加的后处理,最后一个添加的最先处理
如果不需要的callback最好手动销毁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要去掉Jetpack Compose Navigation中的NavigationItem的选中状态,可以使用`rememberNavController`来获取NavController,然后使用`composable`函数中的`navController.currentBackStackEntryAsState()`来获取当前的BackStackEntry。接着,你可以使用`remember`函数来创建一个`LocalBackPressedDispatcher`,并在导航项目的点击事件中调用`navController.navigate`来实现导航。最后,在`NavigationItem`周围包装一个`UnselectedContent`组件,用于在该项目未被选中时显示内容。下面是一个示例代码: ``` val navController = rememberNavController() val backPressedDispatcher = remember { LocalBackPressedDispatcherOwner.current.onBackPressedDispatcher } NavHost( navController, startDestination = "home" ) { composable("home") { HomeScreen( navController = navController, onBackPressed = { backPressedDispatcher.onBackPressed() } ) } composable("profile") { ProfileScreen( navController = navController, onBackPressed = { backPressedDispatcher.onBackPressed() } ) } } BottomNavigation { NavigationItem( icon = Icons.Filled.Home, label = "Home", route = "home", navController = navController, backPressedDispatcher = backPressedDispatcher ) NavigationItem( icon = Icons.Filled.Person, label = "Profile", route = "profile", navController = navController, backPressedDispatcher = backPressedDispatcher ) } @Composable fun NavigationItem( icon: ImageVector, label: String, route: String, navController: NavController, backPressedDispatcher: OnBackPressedDispatcher ) { val backstackEntry = navController.currentBackStackEntryAsState() val selected = backstackEntry.value?.destination?.route == route val onClick = { if (!selected) { navController.navigate(route) { popUpTo(navController.graph.startDestinationId) launchSingleTop = true } } } Box( modifier = Modifier .clickable(onClick = onClick) .height(56.dp) .fillMaxWidth(), contentAlignment = Alignment.Center ) { if (!selected) { UnselectedContent(icon = icon, label = label) } else { SelectedContent(icon = icon, label = label) } } } @Composable fun UnselectedContent(icon: ImageVector, label: String) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Icon(icon, contentDescription = null) Text(text = label) } } @Composable fun SelectedContent(icon: ImageVector, label: String) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Icon(icon, contentDescription = null, tint = MaterialTheme.colors.primary) Text(text = label, color = MaterialTheme.colors.primary) } } ``` 在上面的示例代码中,`UnselectedContent`组件用于在导航项目未被选中时显示内容。我们使用了`Box`组件包装了导航项目,然后在`Box`组件中使用了`UnselectedContent`和`SelectedContent`组件来分别显示未选中和选中的状态。如果当前导航项目未被选中,则显示`UnselectedContent`组件。否则,显示`SelectedContent`组件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值