Jetpack Compose Navigation处理OAuth深链无法获取code参数问题
核心原因
Jetpack Navigation 对深链参数的解析逻辑不会单独读取navDeepLink里声明的查询参数,所有需要自动解析的参数,必须同步在composable的route属性中声明对应占位符。
你当前的配置只在uriPattern里写了code={code},但route写的是固定值"login",没有声明code参数的占位符,所以Navigation不会把uri里的code值解析到arguments Bundle里,这就是日志一直输出默认值的根本原因。
你之前实现的browser页面路径参数能正常工作,正是因为路径参数{url}直接写在了route定义中,符合解析规则。
修复方案
不需要手动从Intent读取参数,Navigation原生支持查询参数解析,只需要按规则修改配置即可:
- 修改composable的route定义,把code作为可选查询参数拼接到路由后
- 同步在arguments里声明code的参数类型和默认值(可选参数必须配默认值/允许null,否则非深链入口进入页面会报错)
修复后的完整代码:
NavGraphBuilder.composable( // 必须在route中声明查询参数占位符,? 表示这是可选查询参数 route = "login?code={code}", arguments = listOf( navArgument("code") { type = NavType.StringType defaultValue = "" // 非深链入口进入时code为空,避免参数缺失崩溃 } ), deepLinks = listOf(navDeepLink { uriPattern = "playground://gh?code={code}" }) ) { backStackEntry -> // 这里可以直接拿到解析后的code值 val authCode = backStackEntry.arguments?.getString("code").orEmpty() Log.d("MyLog", authCode) // 直接在ViewModel中通过savedStateHandle.get<String>("code")即可获取值,无需额外传递 }
注意事项
- 多个查询参数用
&分隔即可,例如需要同时接收state参数的话,route写为login?code={code}&state={state},同步在arguments里声明state参数即可。 - 提前确认AndroidManifest中对应宿主Activity的intent-filter已经正确配置了
playgroundscheme的接收规则,否则深链无法正常跳转到App,参数解析更无从谈起。 - 路径参数和查询参数的区别:路径参数是路由路径的组成部分,属于必填参数,直接写在路径段中(如
browser/{url});查询参数跟在?后,属于可选参数,必须显式在route中声明才会被解析。
内容的提问来源于stack exchange,提问作者peter.o
相关产品推荐
相关产品推荐

