如何在 jetpack 撰写导航中发送可选参数?

问题描述 投票:0回答:2

我尝试在 jetpack 撰写导航中发送可选参数,因为如果我不发送可选参数,这次每次导航到屏幕时它都会要求我输入参数,这会使屏幕互连并导致问题。

我有一个这样的屏幕:

sealed class RegisterScreen(val route: String) {
 
   
    object ForgotPasswordScreen : RegisterScreen("forgot_password_screen")  
    object ForgotPasswordDetailScreen :RegisterScreen("forgot_password_detail_screen")
}

例如,我有一个包含这样的类的密封类,我想给出一个可选的布尔类型参数。

听到的是我的导航图:

fun NavGraphBuilder.registerLoginNavGraph(
    navHostController: NavHostController
) {

    navigation(
        startDestination = RegisterScreen.SignUpStartRegisterScreen .route,
        route = REGISTER_LOGIN_ROUTE
    ) {
       
        composable(RegisterScreen.ForgotPasswordScreen.route) {
            ForgotPasswordScreenRoute(navHostController)
        }
        composable(RegisterScreen.ForgotPasswordDetailScreen.route) {
            ForgotPasswordDetailScreen(navHostController)
        }
       
    }
}

我想从 ForgotPasswordScreen 转到 ForgotPasswordDetailScreen 并且我想向 ForgotPasswordDetailScreen 发送一个可选的布尔类型参数。按照这个结构我该怎么做呢?我该如何适应。我无法将在互联网上完成的事情设置为我自己的代码,你能帮助我吗?如果能用代码解释一下就更好了

kotlin navigation android-jetpack-compose
2个回答
1
投票

添加可选参数

可选参数按照查询参数语法定义

("?argName={argName}")
它们必须具有
defaultValue
集,或者具有
nullable = true
(隐式将默认值设置为 null) 这意味着所有可选参数必须作为列表显式添加到 composable() 函数中:

composable(
    "profile?userId={userId}",
    arguments = listOf(navArgument("userId") { defaultValue = "user1234" })
) { backStackEntry ->
    Profile(navController, backStackEntry.arguments?.getString("userId"))
}

现在,即使没有参数传递到目标,也会使用默认值“user1234”。

通过路由处理参数的结构意味着您的可组合项完全独立于导航,并使它们更易于测试。

请记住,空值将作为“null”字符串返回,因此要实际检查是否存在,您需要执行以下操作:

args.getString("userId")?.takeIf { it != "null" }

0
投票

您可以使用“可选参数”如下

屏幕.Kt

const val PASTED_TEXT_ARG_KEY = "pasted_screen_arg_key"

sealed class Screen(val route: String) {
    data object Translate : Screen(route = "translate_screen/{$PASTED_TEXT_ARG_KEY}") {
        fun passPastedText(pastedText: String? = null): String {
            return "translate_screen/$pastedText"
        }
    }
}

NavGraph.Kt

@Composable
fun SetupNavGraph(
    navController: NavHostController,
    startDestination: String
) {
    NavHost(navController, startDestination) {
        composable(
            route = Screen.Translate.route,
            arguments = listOf(
                navArgument(PASTED_TEXT_ARG_KEY) {
                    nullable = true
                    type = NavType.StringType
                }
            )
        ) {
            it.arguments?.getString(PASTED_TEXT_ARG_KEY).let { pastedText ->
                TranslateScreen(
                    navController = navController,
                    pastedText = pastedText
                )
            }
        }
    }
}

使用示例

navController.navigate(Screen.Translate.passPastedText()) // Or use following
navController.navigate(Screen.Translate.passPastedText("with_some_value"))
© www.soinside.com 2019 - 2024. All rights reserved.