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

Jetpack Compose点击卡片跳转页面崩溃问题如何修复?

修复Jetpack Compose导航崩溃问题

1. 修正导航图路由配置

首先确保导航图中正确定义带参数的路由,并配置参数类型,这是导航跳转的核心前提:

navController.graph.addDestination(
    composable(
        route = "ViewDiaryEntry/{entryId}",
        arguments = listOf(
            navArgument("entryId") {
                type = NavType.LongType // 根据你的entry.id实际类型调整,比如IntType
                nullable = false
            }
        )
    ) { backStackEntry ->
        val entryId = backStackEntry.arguments?.getLong("entryId") ?: 0
        // 从数据源中根据id获取对应的DiaryEntry对象
        val targetEntry = getDiaryEntryById(entryId) // 替换为你的实际数据查询逻辑
        ViewDiaryEntry(entry = targetEntry, navController = navController)
    }
)

2. 调整详情页的参数传递逻辑

你当前的ViewDiaryEntry直接接收DiaryEntry对象,但导航时仅传递了id,需要先通过id从数据源(比如SharedPreferences)中获取完整条目:

@Composable
fun ViewDiaryEntry(entry: DiaryEntry, navController: NavController){
    val context = LocalContext.current
    val sharedPreferences = context.getSharedPreferences("DiaryEntries", Context.MODE_PRIVATE)

    Column {
        AppBarForDiaryView(
            title = "Diary Entry",
            onBackPressed = {
                navController.popBackStack()
            }
        )
        ViewTheDetails(entry = entry)
    }
}

// 新增根据id获取条目的逻辑示例
private fun getDiaryEntryById(entryId: Long, sharedPreferences: SharedPreferences): DiaryEntry? {
    val entryJson = sharedPreferences.getString("diary_entry_$entryId", null)
    // 用Gson/ Moshi等工具将JSON反序列化为DiaryEntry对象
    return entryJson?.let { Gson().fromJson(it, DiaryEntry::class.java) }
}

3. 处理空值与异常防护

当通过id无法获取到有效DiaryEntry时,添加空值处理,避免空指针崩溃:

// 在导航图的composable中添加空值判断
composable(
    route = "ViewDiaryEntry/{entryId}",
    arguments = listOf(navArgument("entryId") { type = NavType.LongType })
) { backStackEntry ->
    val entryId = backStackEntry.arguments?.getLong("entryId") ?: 0
    val sharedPreferences = LocalContext.current.getSharedPreferences("DiaryEntries", Context.MODE_PRIVATE)
    val targetEntry = getDiaryEntryById(entryId, sharedPreferences)

    if (targetEntry == null) {
        LaunchedEffect(Unit) {
            navController.popBackStack()
            Toast.makeText(LocalContext.current, "日记条目不存在", Toast.LENGTH_SHORT).show()
        }
        return@composable
    }

    ViewDiaryEntry(entry = targetEntry, navController = navController)
}

4. 校验路由字符串一致性

确保点击卡片时的导航路由"ViewDiaryEntry/${entry.id}",与导航图中定义的"ViewDiaryEntry/{entryId}"完全匹配,包括参数名称(entryId要和导航参数的name一致)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:53:16