kotlin 如何在jetpack组合导航中发送可选参数?

bybem2ql  于 2023-05-18  发布在  Kotlin
关注(0)|答案(1)|浏览(127)

我尝试在jetpack compose导航中发送可选参数,因为如果我不发送可选参数,这次它会在每次导航到屏幕时都要求我输入参数,这会使屏幕相互连接并导致问题。
我有一个这样的屏幕:

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发送一个可选的boolean类型参数。我怎么能按照这个结构来做呢?我该如何适应。我无法将在互联网上做的事情设置为我自己的代码,你能帮助我吗?用代码解释会更好

6rqinv9w

6rqinv9w1#

添加可选参数
可选参数的定义遵循查询参数语法("?argName={argName}")它们必须有一个defaultValue集,或者有nullable = true(隐式地将默认值设置为null)这意味着所有可选参数必须作为列表显式地添加到composable()函数中:

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

现在,即使没有参数传递到目标,也会使用defaultValue“user1234”。
通过路由处理参数的结构意味着您的组合对象完全独立于Navigation,并使它们更易于测试。
请记住,null值将作为“null”字符串返回,因此要实际检查是否存在,您需要执行以下操作:

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

相关问题