如何导航至同一个Composable组件并传入不同参数?
如何导航至同一个Composable组件并传入不同参数?
我懂你现在的困扰啦——想点击不同难度按钮,跳转到同一个AdditionScreen还带上对应的level参数,用NavHost的时候卡到ChooseLevel的实现了对吧?别慌,这事儿其实很简单,我给你一步步说清楚怎么做:
首先,我们得先把导航的路由规则定义好,用密封类来管理路由会更清晰:
sealed class Screen(val route: String) { // 选择难度的界面路由 object ChooseLevel : Screen("choose_level") // 加法界面的路由,用{level}作为参数占位符 data class AdditionScreen(val level: String) : Screen("addition_screen/{level}") { // 生成带具体参数的完整路由 fun createRoute() = "addition_screen/$level" } }
接下来配置NavHost,把两个界面的路由和对应的Composable绑定起来,重点是怎么解析AdditionScreen的参数:
NavHost(navController = navController, startDestination = Screen.ChooseLevel.route) { // 绑定选择难度的界面 composable(Screen.ChooseLevel.route) { ChooseLevelScreen(navController = navController) } // 绑定加法界面,并从回退栈里解析level参数 composable(Screen.AdditionScreen.route) { backStackEntry -> // 这里用?:"easy"做个默认值,防止参数为空的情况 val level = backStackEntry.arguments?.getString("level") ?: "easy" AdditionScreen(level = level) } }
然后就是你卡住的ChooseLevel界面啦,这里的核心就是点击按钮时,调用navController导航到带对应参数的AdditionScreen路由:
@Composable fun ChooseLevelScreen(navController: NavController) { Column( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Button( onClick = { // 点击Easy按钮,导航到带easy参数的路由 navController.navigate(Screen.AdditionScreen("easy").createRoute()) } ) { Text(text = "Easy") } // 加个间隔让按钮不挤在一起 Spacer(modifier = Modifier.height(16.dp)) Button( onClick = { // 点击Medium按钮,导航到带medium参数的路由 navController.navigate(Screen.AdditionScreen("medium").createRoute()) } ) { Text(text = "Medium") } } }
最后就是AdditionScreen接收参数并使用啦,直接把level参数传进来就行:
@Composable fun AdditionScreen(level: String) { Column( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Text(text = "当前难度:$level") // 这里就可以根据level写你的加法逻辑啦 } }
这样操作下来,点击不同按钮就能跳转到同一个AdditionScreen,还能带上对应的难度参数了~如果之后要加Hard难度,只需要多写一个按钮,调用带"hard"参数的路由就行,非常方便。
内容来源于stack exchange
相关产品推荐
相关产品推荐

