Morozov
Morozov

Reputation: 5250

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

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

Upvotes: 1

Views: 602

Answers (2)

Stefano Sansone
Stefano Sansone

Reputation: 2709

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

Upvotes: 1

Ravi Kumar
Ravi Kumar

Reputation: 4508

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

Upvotes: 0

Related Questions