如何使用我通过撰写从另一个屏幕传递的参数?

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

我想在从 AuthenticationScreen

传递的 AccountListScreen 中使用 accessToken

这是我的 MainActivity 的代码:

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 解决方案并得到以下错误 也许我做错了什么

但是我连接了一个依赖项:

implementation "androidx.navigation:navigation-compose:2.4.0-alpha10"

更新 2

您可以通过将 navArgument 列表传递到屏幕来指定目的地的参数。参考以下代码:

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

如果您使用的是 NavHost,一种方法是在您的 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)
}

并且刚刚在您的可组合项中接收参数

@Composable
fun AccountListScreen(
    navController: NavController,
    token: String,
    viewModel: AccountListViewModel = hiltViewModel()
) {

查看 Navigate with arguments 了解更多详细信息和示例