将 URL 作为参数传递给 Jetpack Compose Navigation

Alp*_*a 1 53 android android-jetpack-compose

我在我的应用程序中创建了屏幕目的地HistoryDetail

composable(
    route = "HistoryDetail/{webpage}",
    arguments = listOf(
        navArgument("webpage") {
            type = NavType.StringType
        }
    ),
) { entry ->
    val text = entry.arguments?.getString("webpage") ?: ""
}
Run Code Online (Sandbox Code Playgroud)

当我尝试通过调用导航到该屏幕时:

navController.navigate("HistoryDetail/http://alphaone.me/")
Run Code Online (Sandbox Code Playgroud)

我收到illegalArgumentException以下消息。

java.lang.IllegalArgumentException: Navigation destination that matches request NavDeepLinkRequest{ uri=android-app://androidx.navigation/HistoryDetail/http://alphaone.me/ } cannot be found in the navigation graph NavGraph(0x0) startDestination={Destination(0x78c9ba0c) route=Home}
Run Code Online (Sandbox Code Playgroud)

编辑:

如果我打电话,它就会起作用:navController.navigate("HistoryDetail/test")

Phi*_*hov 86

导航路线相当于 url。一般来说,你应该经过类似的地方id

当你需要在另一个 url 中传递一个 url 时,你需要对其进行编码:

val encodedUrl = URLEncoder.encode("http://alphaone.me/", StandardCharsets.UTF_8.toString())
navController.navigate("HistoryDetail/$encodedUrl")
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要在视图端解码参数,因为导航库会为您完成此操作。

  • @elliptic1 实际上 jetpack 导航正在解码其一侧的参数,所以通常您不需要手动执行此操作 (5认同)
  • 就我而言,它抛出一个异常:`java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8] at java.nio.charset.Charset.checkCharsetName(Charset.java:201)`。为了解决这个问题,我用“UTF-8”字符串替换了“StandardCharsets.UTF_8.toString()”。 (3认同)
  • 然后`URLDecoder.decode(...)` (2认同)

小智 5

这怎么样?

composable(
    route = "HistoryDetail?webpage={webpage}",
    arguments = listOf(
        navArgument("webpage") {
            type = NavType.StringType
        }
    ),
) { entry ->
    val text = entry.arguments?.getString("webpage") ?: ""
}
Run Code Online (Sandbox Code Playgroud)