0

我正在尝试从第一个屏幕导航到第二个屏幕,我需要提供一个整数标识符来从第二个屏幕上的 API 加载内容。

尝试传递 Int Nav 参数时遇到此错误。

java.lang.ClassCastException:java.lang.String 不能转换为 java.lang.Integer

这是我的 NavHost,我/{recipeId}在第二个屏幕的路线上用作占位符。

            NavHost(
                    navController = navController,
                    startDestination = Screens.RecipesOverviewScreen.route
                ) {

                    //1st Screen
                    composable(route = Screens.RecipesOverviewScreen.route) {

                        RecipesOverviewScreen(
                            navController = navController,
                            onToggleTheme = { app.toggleLightTheme() })
                    }

                    //2nd Screen
                    composable(route = "${Screens.RecipeDetailScreen.route}/{recipeId}")
                    {
                        RecipeDetailScreen()
                    }

然后我调用navController.navigate()第一个屏幕,将idInt 类型的类型传入导航路线。

RecipeList(recipes = listState.recipes,
                    onClickRecipeCard = { id ->
                    
                        //insert corresponding Int id into the Nav route
                        navController.navigate(
                        route = "${Screens.RecipeDetailScreen.route}/${id}"
     
                        )
                    }

在第二个屏幕的 ViewModel 中,我使用 SavedHandleInstance 检索 nav 参数。

@HiltViewModel
class RecipeViewModel @Inject constructor(
   
    savedStateHandle: SavedStateHandle
) : ViewModel() {

    init {
        //pass in the key inside get() fxn
        savedStateHandle.get<Int>(Constants.PARAM_RECIPE_ID)
                ?.let { id ->
                    //perform an API call inside init{} using nav arg id
                   getRecipe(id = id, token = token)

                    
                } ....}

此时,应用程序崩溃了,我得到了上面的 logcat 输出。

请在传递 Int Nav arg 时指出我正确的方向。

4

1 回答 1

1

当您将第二个屏幕定义为:

composable(route = "${Screens.RecipeDetailScreen.route}/{recipeId}") {

您没有为recipeId参数定义任何类型。根据Navigate with arguments 指南

默认情况下,所有参数都被解析为字符串。您可以通过使用arguments参数来指定另一种类型来设置type

因此,如果您希望自己recipeId成为Int,则必须将其声明为IntType

composable(
  route = "${Screens.RecipeDetailScreen.route}/{recipeId}",
  arguments = listOf(navArgument("recipeId") { type = NavType.IntType })
) {

这将确保您的调用savedStateHandle.get<Int>实际上有一个Intto find,而不是一个String.

于 2021-12-26T02:02:55.057 回答