gpt4 book ai didi

android - Jetpack Compose Navigation - 将参数传递给 startDestination

转载 作者:行者123 更新时间:2023-12-04 23:40:21 39 4
gpt4 key购买 nike

我正在构建的应用程序使用带有路线的组合导航。挑战在于起始目的地是动态的。
这是一个最小的例子:

class MainActivity : ComponentActivity()
{
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)

setContent {
val navController = rememberNavController()

NavHost(
navController = navController,
startDestination = "dynamic/1", // doesn't work
// startDestination = "static", // workaround
) {
composable(
route = "dynamic/{$ARG_ID}",
arguments = listOf(navArgument(ARG_ID) { type = NavType.StringType }),
) {
val id = it.arguments?.getString(ARG_ID)
Text("dynamic route, received argument: $id!")
}
// part of the workaround
// composable(
// route = "static",
// ) {
// LaunchedEffect(this) {
// navController.navigate("dynamic/1")
// }
// }
}
}
}

companion object
{
const val ARG_ID = "id"
}
}
该应用程序崩溃
java.lang.IllegalArgumentException: navigation destination route/1 is not a direct child of this NavGraph
仅当“动态”路线用作起始目的地时,才会存在问题。这可以通过使用 startDestination = "static" 来验证。 .
虽然,“静态”路由解决方法有效,但我正在寻找没有它的解决方案,因为它会混淆代码并且还在后台堆栈中创建一个额外的条目。
-> Full code sample重现问题
相关的 SO 问题
  • Navigation Architecture Component- Passing argument data to the startDestination - 答案似乎不适用于撰写导航。
  • Pass an argument to a nested navigation graph in Jetpack Compose - 没有给出答案。
  • Compose Navigation - navigation destination ... is not a direct child of this NavGraph - 接受的答案不能解决问题。

  • 编辑:
    我想强调的是,原始样本过去不包含“静态”可组合。我只添加了“静态”可组合以使 startDestination 正常工作并证明可以导航到“动态”可组合项。
    更新:
    甚至切换到 query parameter syntax for optional arguments ,提供默认值,并且不带任何参数设置起始目的地不起作用。
    以下变体
    NavHost(
    navController = navController,
    startDestination = "dynamic",
    ) {
    composable(
    route = "dynamic?$ARG_ID={$ARG_ID}",
    arguments = listOf(navArgument(ARG_ID) { type = NavType.StringType; defaultValue = "1" }),
    ) {
    val id = it.arguments?.getString(ARG_ID)
    Text("dynamic route, received argument: $id!")
    }
    }
    导致异常
    java.lang.IllegalArgumentException: navigation destination dynamic is not a direct child of this NavGraph

    最佳答案

    全部归功于 ianhanniballake ,谁在评论中向我解释了解决方案。我将在这里展示我的代码示例的工作版本。
    对我来说最大的见解是:
    startDestination不能匹配可组合的 route在模式匹配的意义上,但它必须是完全相同的字符串 .
    这意味着无法通过 startDestination 设置参数直接但必须通过参数的 defaultValue 设置.
    这是工作示例:

    class MainActivity : ComponentActivity()
    {
    override fun onCreate(savedInstanceState: Bundle?)
    {
    super.onCreate(savedInstanceState)

    setContent {
    val navController = rememberNavController()

    NavHost(
    navController = navController,
    // 1st change: Set startDestination to the exact string of route
    startDestination = "dynamic/{$ARG_ID}", // NOT "dynamic/1", provide arguments via defaultValue
    ) {
    composable(
    route = "dynamic/{$ARG_ID}",
    // 2nd change: Set startDestination argument via defaultValue
    arguments = listOf(navArgument(ARG_ID) { type = NavType.StringType; defaultValue = "1" }),
    ) {
    val id = it.arguments?.getString(ARG_ID)
    Text("dynamic route, received argument: $id!")
    }
    }
    }
    }

    companion object
    {
    const val ARG_ID = "id"
    }
    }
    该方法同样适用于以查询参数形式提供的参数。
    老实说,我认为这是一个小的限制,因为开始路线现在规定了必须是 defaultValue 的内容。 .我可能想设置一个不同的 defaultValue或者根本没有。然而,在大多数情况下,这应该是最优雅的解决方案。

    关于android - Jetpack Compose Navigation - 将参数传递给 startDestination,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70404038/

    39 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com