我尝试在 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 发送一个可选的布尔类型参数。按照这个结构我该怎么做呢?我该如何适应。我无法将在互联网上完成的事情设置为我自己的代码,你能帮助我吗?如果能用代码解释一下就更好了
可选参数按照查询参数语法定义
("?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" }
您可以使用“可选参数”如下
屏幕.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"))