【问题标题】:java.lang.IllegalArgumentException when navigate with argument in Navigation Android Compose在 Navigation Android Compose 中使用参数导航时出现 java.lang.IllegalArgumentException
【发布时间】:2023-02-06 02:50:27
【问题描述】:

在我的第一个撰写项目中尝试使用参数导航时遇到问题
错误:

java.lang.IllegalArgumentException: Navigation destination that matches request NavDeepLinkRequest{ uri=android-app://androidx.navigation/transaction_detail/{1} } cannot be found in the navigation graph NavGraph...

我的导航图:

@Composable
fun SetupNavGraph(
    navController: NavHostController
) {
    NavHost(
        navController = navController,
        startDestination = HomeDestination.route,
    ) {
        composable(route = HomeDestination.route) {
            HomeScreen(
                navigateToItemEntry = { navController.navigate(TransactionEntryDestination.route) },
                navigateToItemUpdate = {
                    navController.navigate("${TransactionDetailDestination.route}/{$it}")
                }
            )
        }

        //detail screen route
        composable(
            route = TransactionDetailDestination.routeWithArgs,
            arguments = listOf(
                navArgument(TransactionDetailDestination.transactionIdArg) {
                    type = NavType.IntType
                }
            )
        ) {
            val id = it.arguments?.getInt(TransactionDetailDestination.transactionIdArg)!!
            TransactionDetailScreen(id)
        }
    }
}
    

我的交易详情屏幕:

object TransactionDetailDestination : NavigationDestination {
    override val route  = "transaction_detail"
    override val title = "Transaction Detail Screen"
    const val transactionIdArg = "transactionId"
    val routeWithArgs = "$route/{$transactionIdArg}"
}

@Composable
fun TransactionDetailScreen(id: Int) {
    Scaffold {
        TransactionDetailBody(paddingValues = it, id = id)
    }
}

@Composable
fun TransactionDetailBody(
    paddingValues: PaddingValues,
    id: Int
) {
    Column(modifier = Modifier.fillMaxSize()) {
        Text(text = "$id", fontSize = 100.sp)
        ...
    }
}

我可以看到问题是到交易详细信息目的地的路径,但我不知道在哪里更正。我期待着每一个建议!

【问题讨论】:

    标签: android android-jetpack-compose android-architecture-navigation android-navigation


    【解决方案1】:

    通过对互联网的研究,很多人意识到在指定要走的路线时,就我而言,总是这样:

    //'it' is the argument we need to send
    //rule: 'route/value1/value2...' where 'value' is what we trying to send over
    navController.navigate("${TransactionDetailDestination.route}/$it") 
    

    我们需要从中提取参数的路由字符串:

    //notice the naming rule: 'route/{arg1}/{arg2}/...'
    val routeWithArgs = "${route}/{${transactionIdArg}}" 
    

    只有执行上述操作,编译器才会理解您尝试发送和接收的参数。我的错误是没有仔细阅读。希望能帮助到你!

    【讨论】:

      【解决方案2】:

      我认为你没有像这样在你的图表中声明你的目标参数

      composable("transaction_detail/{id}")
      

      根据这个documentation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多