You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),只是使用了带占位符的路由模板,没有替换成实际参数值。

修复步骤

  1. 确认NavScreen.ScanStudentQr的路由定义(示例结构):
object NavScreen {
    object ScanStudentQr {
        const val route = "scan_student_qr"
        const val argument0 = "attendance_type"
        val routeWithArgument = "$route/{$argument0}"
    }
}
  1. 修改MainActivity中的导航回调,将实际参数值拼接到路由中:
navigateToScanStudentQr = { attendanceType ->
    currentScreen = MyConstantes.scanStudentQrScreen
    // 替换路由占位符为实际参数值
    val targetRoute = "${NavScreen.ScanStudentQr.route}/$attendanceType"
    navController.navigate(targetRoute)
}
  1. 优化参数接收逻辑,添加默认值避免页面无法加载:
val attendanceType = backStackEntry.arguments?.getString(NavScreen.ScanStudentQr.argument0) ?: "DEFAULT"

额外检查点

  • 确认NavScreen.ScanStudentQr.argument0的名称和路由中占位符名称完全一致
  • 导航前打印attendanceType,确认参数传递时的值是否正确
  • 检查是否有其他代码覆盖attendanceType变量的值

内容的提问来源于stack exchange,提问作者user3677038

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:23:12