Home > OS >  How to use the argument that I passed from another screen using compose?
How to use the argument that I passed from another screen using compose?

Time:10-01

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"

UPDATE 2 enter image description here enter image description here enter image description here

enter image description here

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