如何点击ListScreen中Scaffold抽屉设置项跳转至SettingScreen?
解决方案
1. 修正Screens类的导航路由
先统一跳转路由与定义的Constants.SETTING_SCREEN,避免路由不匹配:
class Screens (navController: NavHostController) { val setting: () -> Unit = { navController.navigate(route = Constants.SETTING_SCREEN) { // 若不需要限制回退栈可移除该popUpTo逻辑,保留则跳转后清空SettingScreen相关栈 popUpTo(Constants.SETTING_SCREEN) { inclusive = true } } } }
2. 给ListScreen添加跳转参数
让ListScreen接收跳转函数参数,才能传递给内部的DrawerContent:
@Composable fun ListScreen( navigateToTaskScreen: (taskId: Int) -> Unit, viewModel: ViewModel, onNavigationIconClick: () -> Unit, // 新增跳转SettingScreen的参数 navigateToSettingScreen: () -> Unit ) { Scaffold( drawerContent = { DrawerContent( viewModel = viewModel, // 传递跳转函数,替换空实现 navigateToSettingScreen = navigateToSettingScreen ) }, // 其他Scaffold配置项... ) { paddingValues -> // ListScreen页面内容... } }
3. 在导航图中给ListScreen传递跳转函数
在SetupNavigation的NavHost里,给ListScreen对应的composable传递screen.setting:
@Composable fun SetupNavigation( navController: NavHostController, viewModel: ViewModel, onNavigationIconClick: () -> Unit, ) { val screen = remember(navController) { Screens(navController = navController) } NavHost( navController = navController, startDestination = SPLASH_SCREEN ) { // 其他页面的composable配置... listComposable( navigateToTaskScreen = { /* 原有跳转逻辑 */ }, viewModel = viewModel, onNavigationIconClick = onNavigationIconClick, // 传递跳转SettingScreen的函数 navigateToSettingScreen = screen.setting ) settingComposable( viewModel = viewModel ) } }
4. 简化SettingScreen相关代码
SettingScreen本身不需要跳转自身的参数,移除冗余配置:
// 修改SettingComposable,移除多余参数 fun NavGraphBuilder.settingComposable( viewModel: ViewModel ) { composable( route = Constants.SETTING_SCREEN, ) { SettingsScreen(viewModel = viewModel) } } // 修改SettingsScreen,移除不需要的参数 @Composable fun SettingsScreen( viewModel : ViewModel ) { // SettingsScreen页面内容... }
5. 验证DrawerContent逻辑
你的DrawerContent点击逻辑已经正确调用了navigateToSettingScreen(),参数传递正常后即可触发跳转:
@Composable fun DrawerContent( viewModel: ViewModel, gradientColors: List<Color> = listOf(Color(0xFFDAB74E), Color(0xFFC46608)), navigateToSettingScreen: () -> Unit ) { DrawerItem( icon = painterResource(id = R.drawable.ic_settings), label = "Settings" ) { viewModel.drawerBarState.value = DrawerBarState.SETTINGS navigateToSettingScreen() // 现在会正确触发导航跳转 } }
完成以上修改后,从ListScreen打开抽屉点击设置图标,就能正常跳转到SettingScreen。
内容的提问来源于stack exchange,提问作者DongjinLee26
相关产品推荐
相关产品推荐

