I want to use accessToken
in the AccountListScreen
which I pass from AuthenticationScreen
Here is code of my MainActivity:
composable(
route = Screen.AuthenticationScreen.route
) {
AuthenticationScreen(navController)
}
composable(
route = Screen.AccountListScreen.route "/{accessToken}"
) {
AccountListScreen(navController)
}
So I'm trying to pass a parameter from my 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}")
}
}
And I don't understand how I can now get my parameter in AccountListScreen
:
@Composable
fun AccountListScreen(
navController: NavController,
viewModel: AccountListViewModel = hiltViewModel()
) {
UPDATE
I try to use the @Alpha 1 solution and get the following error maybe I'm doing something wrong
But I have a dependency connected:
implementation "androidx.navigation:navigation-compose:2.4.0-alpha10"
CodePudding user response:
If you're using a NavHost, a way could be defining the composable like this in your 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)
}
And the just receive the parameter in your composable
@Composable
fun AccountListScreen(
navController: NavController,
token: String,
viewModel: AccountListViewModel = hiltViewModel()
) {
Check Navigate with arguments for more details and examples
CodePudding user response:
You can specify the argument for a destination by passing a list of navArgument to your screen. refer the code below:
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)
}