Navigation组件异常:无法找到匹配NavDeepLinkRequest的导航目标
问题排查与修复
核心问题分析
- 路由匹配失败:你定义的路由是
"${Graph.BOOK}/{id}",其中{id}是必填占位符,但调用navigate(Graph.BOOK)时没有携带id参数,系统找不到完全匹配的导航目标,因此抛出IllegalArgumentException。 - 参数类型不匹配:路由参数定义的是
NavType.LongType,但代码里用getInt("id")获取,后续会触发类型转换异常。
修复步骤
1. 将id改为可选参数
在路由定义中给{id}加上?后缀,标记为可选参数,同时修正参数类型与获取逻辑:
animatedCompose("${Graph.BOOK}/{id}?", // 加?标记为可选参数 arguments = listOf( navArgument("id"){ type = NavType.LongType defaultValue = -1L // 使用Long类型默认值,与定义类型一致 } ) ){ // 用getLong获取参数,匹配定义的类型 val id = it.arguments?.getLong("id") ?: -1L val actionText = if(id != -1L) "Save" else "Add" val title = if(id != -1L) "Edit Book" else "Add New Book" BookScreen(navHostController, title=title, actionText=actionText) }
2. 调整调用逻辑
- 新增书籍时,直接调用
navigate(Graph.BOOK)(此时id会使用默认值-1L) - 编辑书籍时,携带具体id参数:
// 示例:编辑id为123的书籍 rootNavHostController.navigate("${Graph.BOOK}/123")
补充说明
Compose Navigation中,{param}格式的路由默认是必填参数,必须携带参数才能匹配;加上?后变为可选参数,不传参数时会使用你定义的defaultValue。同时要保证参数定义的类型和获取时的类型完全一致,避免类型转换错误。
内容的提问来源于stack exchange,提问作者Alix Blaine
相关产品推荐
相关产品推荐

