Как использовать аргумент, который я передал с другого экрана с помощью compose?

#android #kotlin #android-jetpack-compose #android-jetpack

Вопрос:

Я хочу использовать accessToken в AccountListScreen том, что я передаю из AuthenticationScreen

Вот код моей основной деятельности:

 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 и получаю следующую ошибку, возможно, я делаю что-то не так

Но у меня есть зависимость, связанная:

реализация «androidx.навигация:навигация-состав:2.4.0-alpha10»

ОБНОВЛЕНИЕ 2
введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. Ознакомьтесь с документацией

Ответ №1:

Если вы используете NavHost, можно было бы определить составную часть следующим образом в вашей основной деятельности

 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()
) {
 

Проверьте «Навигация с аргументами» для получения более подробной информации и примеров

Комментарии:

1. Я не знаю почему, но я получаю пустую строку, хотя во время передачи я вижу, что моя accessToken не пуста

2. Можете ли вы проверить, пожалуйста, экраны в моем вопросе в разделе UPDATE 2

3. Я отредактировал ответ, попробуйте использовать a const . И установите маршрут вот так route = Screen.AccountListScreen.route "/{$ACCESS_TOKEN}" , и получите вот так val token = arguments.getString(ACCESS_TOKEN)

4. Но как мне нужно изменить свой метод, AuthenticationScreen если я использую ACCESS_TOKEN from composableData ? navController.navigate(Screen.AccountListScreen.route "/${state.accessToken}")

Ответ №2:

Вы можете указать аргумент для пункта назначения, передав список наваргументов на свой экран. обратитесь к приведенному ниже коду:

 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)
}
 

Комментарии:

1. Можете ли вы проверить, пожалуйста, мои обновления?