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
相关产品推荐
相关产品推荐

