JetPack Compose页面间变量传递失败问题求助
页面间参数传递异常排查:传递值未正确接收
我尝试在三个页面间传递字符串参数:
- MainActivity:负责导航逻辑
- OptionsScreen:参数发起页面,传递"INGRESO"或"SALIDA"
- ScanStudentQrScreen:参数接收页面
但日志打印时,attendanceType显示的是字面文本"attendanceType"而非预期值,请求排查问题。
OptionsScreen 相关代码
fun OptionsScreen( optionsViewmodel: OptionsViewmodel = getViewModel(), position: Int, navigateToActivitiesScreen: (Int) -> Unit, navigateTocardScreen: (Int) -> Unit, navigateToActivitySelection: () -> Unit, navigateToSelectionScreen: () -> Unit, navigateToLoginScreen: () -> Unit, navigateToUpdateMyDataScreen: () -> Unit, navigateToContactsScreen:() -> Unit, navigateToNewsScreen:() -> Unit, navigateToScanStudentQr: (String) -> Unit ) { // ... 其他代码 if (showDialogFlagStudenAttendence) { CommonDialogTwoButtons( title = stringResource(id = R.string.title_student_attendence_exit), body = "", firstOptionText = stringResource(id = R.string.option1_student_attendence_exit), secondOptionText = stringResource(id = R.string.option2_student_attendence_exit), firstOption = { mainActivity.startUserInactivityTimer() navigateToScanStudentQr("INGRESO") showDialogFlagStudenAttendence = false }, secondOption = { mainActivity.startUserInactivityTimer() navigateToScanStudentQr("SALIDA") showDialogFlagStudenAttendence = false } ) } }
MainActivity 导航相关代码
// 导航回调定义 navigateToScanStudentQr = { attendanceType -> currentScreen = MyConstantes.scanStudentQrScreen navController.navigate(NavScreen.ScanStudentQr.routeWithArgument) } // 页面路由注册 composable( route = NavScreen.ScanStudentQr.routeWithArgument, arguments = listOf(navArgument(NavScreen.ScanStudentQr.argument0) { type = NavType.StringType }), enterTransition = { enterTransition(this) }, exitTransition = { exitTransition(this) }, popEnterTransition = { popEnterTransition(this) }, popExitTransition = { popExitTransition(this) } ) { backStackEntry -> val attendanceType = backStackEntry.arguments?.getString(NavScreen.ScanStudentQr.argument0) ?: return@composable KoinContext { ScanStudentQrScreen( attendanceType = attendanceType, pressBackButton = { navController.popBackStack() }, navigateToSaveStudentAttendance = { index, value -> currentScreen = MyConstantes.saveStudentAttendanceScreen navController.navigate(NavScreen.SaveStudentAttendance.route) } ) } }
ScanStudentQrScreen 接收参数代码
@Composable fun ScanStudentQrScreen( attendanceType: String, pressBackButton: () -> Unit, navigateToSaveStudentAttendance: (Int, String) -> Unit ) { Napier.i("ScanStudentQrScreen") Napier.i("ScanStudentQrScreen - attendanceType $attendanceType") }
问题根源
导航时没有将传递的参数拼接到路由地址中,导致参数没有被正确存入BackStack的arguments里。当前代码直接调用navController.navigate(NavScreen.ScanStudentQr.routeWithArgument),只是使用了带占位符的路由模板,没有替换成实际参数值。
修复步骤
- 确认
NavScreen.ScanStudentQr的路由定义(示例结构):
object NavScreen { object ScanStudentQr { const val route = "scan_student_qr" const val argument0 = "attendance_type" val routeWithArgument = "$route/{$argument0}" } }
- 修改MainActivity中的导航回调,将实际参数值拼接到路由中:
navigateToScanStudentQr = { attendanceType -> currentScreen = MyConstantes.scanStudentQrScreen // 替换路由占位符为实际参数值 val targetRoute = "${NavScreen.ScanStudentQr.route}/$attendanceType" navController.navigate(targetRoute) }
- 优化参数接收逻辑,添加默认值避免页面无法加载:
val attendanceType = backStackEntry.arguments?.getString(NavScreen.ScanStudentQr.argument0) ?: "DEFAULT"
额外检查点
- 确认
NavScreen.ScanStudentQr.argument0的名称和路由中占位符名称完全一致 - 导航前打印
attendanceType,确认参数传递时的值是否正确 - 检查是否有其他代码覆盖
attendanceType变量的值
内容的提问来源于stack exchange,提问作者user3677038
相关产品推荐
相关产品推荐

