如何使用我通过撰写从另一个屏幕传递的参数?
How to use the argument that I passed from another screen using compose?
我想在从 AuthenticationScreen
传递的 AccountListScreen
中使用 accessToken
这是我的 MainActivity 的代码:
composable(
route = Screen.AuthenticationScreen.route
) {
AuthenticationScreen(navController)
}
composable(
route = Screen.AccountListScreen.route + "/{accessToken}"
) {
AccountListScreen(navController)
}
所以我试图从我的 AuthenticationScreen
:
传递一个参数
@Composable
fun AuthenticationScreen(
navController: NavController,
viewModel: AuthenticationViewModel = hiltViewModel()
) {
val authorizeUrl: String by viewModel.authorizeUrl.observeAsState("")
WebPageScreen(urlToRender = authorizeUrl, viewModel = viewModel)
val state = viewModel.state.value
if (state.accessToken.isNotEmpty()) {
navController.navigate(Screen.AccountListScreen.route + "/${state.accessToken}")
}
}
而且我不明白现在如何在 AccountListScreen
中获取我的参数:
@Composable
fun AccountListScreen(
navController: NavController,
viewModel: AccountListViewModel = hiltViewModel()
) {
更新
我尝试使用@Alpha 1 解决方案并得到以下错误
也许我做错了什么
但是我连接了一个依赖项:
implementation "androidx.navigation:navigation-compose:2.4.0-alpha10"
更新 2
您可以通过将 navArgument 列表传递到屏幕来指定目的地的参数。参考以下代码:
composable(
route = Screen.AccountListScreen.route + "/{accessToken}",
arguments = listOf(
navArgument("accessToken") {
type = NavType.StringType
}
)
) { entry ->
//reading the access token
val accessToken = entry.arguments?.getString("accessToken") ?: ""
AccountListScreen(navController)
}
如果您使用的是 NavHost,一种方法是在您的 MainActivity
中像这样定义可组合项
object composablesData {
const val ACCESS_TOKEN = "ACCESS_TOKEN"
}
...
composable(
route = Screen.AccountListScreen.route + "/{$ACCESS_TOKEN}"
) {
val arguments = requireNotNull(it.arguments)
val token = arguments.getString(ACCESS_TOKEN) //set the correct type
AccountListScreen(navController,token)
}
并且刚刚在您的可组合项中接收参数
@Composable
fun AccountListScreen(
navController: NavController,
token: String,
viewModel: AccountListViewModel = hiltViewModel()
) {
查看 Navigate with arguments 了解更多详细信息和示例
我想在从 AuthenticationScreen
AccountListScreen
中使用 accessToken
这是我的 MainActivity 的代码:
composable(
route = Screen.AuthenticationScreen.route
) {
AuthenticationScreen(navController)
}
composable(
route = Screen.AccountListScreen.route + "/{accessToken}"
) {
AccountListScreen(navController)
}
所以我试图从我的 AuthenticationScreen
:
@Composable
fun AuthenticationScreen(
navController: NavController,
viewModel: AuthenticationViewModel = hiltViewModel()
) {
val authorizeUrl: String by viewModel.authorizeUrl.observeAsState("")
WebPageScreen(urlToRender = authorizeUrl, viewModel = viewModel)
val state = viewModel.state.value
if (state.accessToken.isNotEmpty()) {
navController.navigate(Screen.AccountListScreen.route + "/${state.accessToken}")
}
}
而且我不明白现在如何在 AccountListScreen
中获取我的参数:
@Composable
fun AccountListScreen(
navController: NavController,
viewModel: AccountListViewModel = hiltViewModel()
) {
更新
我尝试使用@Alpha 1 解决方案并得到以下错误 也许我做错了什么
但是我连接了一个依赖项:
implementation "androidx.navigation:navigation-compose:2.4.0-alpha10"
更新 2
您可以通过将 navArgument 列表传递到屏幕来指定目的地的参数。参考以下代码:
composable(
route = Screen.AccountListScreen.route + "/{accessToken}",
arguments = listOf(
navArgument("accessToken") {
type = NavType.StringType
}
)
) { entry ->
//reading the access token
val accessToken = entry.arguments?.getString("accessToken") ?: ""
AccountListScreen(navController)
}
如果您使用的是 NavHost,一种方法是在您的 MainActivity
中像这样定义可组合项object composablesData {
const val ACCESS_TOKEN = "ACCESS_TOKEN"
}
...
composable(
route = Screen.AccountListScreen.route + "/{$ACCESS_TOKEN}"
) {
val arguments = requireNotNull(it.arguments)
val token = arguments.getString(ACCESS_TOKEN) //set the correct type
AccountListScreen(navController,token)
}
并且刚刚在您的可组合项中接收参数
@Composable
fun AccountListScreen(
navController: NavController,
token: String,
viewModel: AccountListViewModel = hiltViewModel()
) {
查看 Navigate with arguments 了解更多详细信息和示例