#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»
Комментарии:
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
fromcomposableData
?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. Можете ли вы проверить, пожалуйста, мои обновления?