来自 Oauth 的 Jetpack Compose Deeplink 导航

Pet*_* O. 5 android android-jetpack-compose jetpack-compose-navigation

我正在尝试通过 ViewModel 中的codeGitHub Oauth API获取. 我的可组合屏幕配置:playground://gh?code=XYZsavedStateHandler

NavGraphBuilder.composable(
         route = "login",
         deepLinks = listOf(navDeepLink {
            uriPattern = "playground://gh?code={code}"
         })
      ) {
         Log.d("MyLog", it.arguments?.getString("code", "nothing") ?: "null")
         //...
      }
Run Code Online (Sandbox Code Playgroud)

MyLog总是nothing

我也尝试实现该NavGraphBuilder.composable.arguments参数,但结果是一样的。

我刚刚熟悉 Compose 并完成了 Google Code 实验室。https://developer.android.com/codelabs/jetpack-compose-navigation#4 - 这按预期工作,但问题是需要参数。

我还有一个需要 URL 并且可以工作的 WebViewScreen 可组合项。

builder.composable(
         route = "browser",
         arguments = listOf(
            navArgument("url") {
               type = NavType.StringType
            }
         ),
         deepLinks = listOf(
            navDeepLink {
               uriPattern = "playground://gh/browser/{url}"
            }
         )
      ) {
         //...
      }
Run Code Online (Sandbox Code Playgroud)

不确定这是否可以通过 Jetpack Compose Navigation 来实现,还是我必须使用Intent将其传递给 的方法ViewModel

cgo*_*ijo 5

我和你的情况一样,正在熟悉 Jetpack Compose 并构建一个使用 OAuth 身份验证的应用程序。

在完成您提到的相同 Codelab 后,我已设法从深层链接 uri 获取授权代码。

尝试将此代码添加到您的 MainActivity 以确保您的回调 uri 包含身份验证代码:

    override fun onResume() {
        super.onResume()
        val data: Uri? = intent?.data
        val code = data?.getQueryParameter("code")
        Log.d("MainActivity", "oauth code - $code")
    }
Run Code Online (Sandbox Code Playgroud)

它对我有用,当身份验证重定向到我的应用程序时,我可以在日志中看到代码。

不过,我使用的是不同的方法,我使用隐式意图将用户重定向到端点进行身份验证,并且我没有使用 Github API。

编辑:

以下是可组合参数:

    composable(
        route = "OAuthRedirectWithCode",
        arguments = listOf(navArgument("code") { type = NavType.StringType }),
        deepLinks = listOf(navDeepLink { uriPattern = "$uri?code={code}" })
    ) { backStackEntry ->
        val code = backStackEntry.arguments?.getString("code")
        Log.d("NavHost", "oauth code - $code")
      }


Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!