在 Compose 中使用 SavedStateHandle 传递整数导航参数时发生投射错误

Fan*_*dez 4 android android-jetpack-compose jetpack-compose-navigation

我正在尝试从第一个屏幕导航到第二个屏幕,并且我需要提供一个整数标识符来从第二个屏幕上的 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()
                    }
Run Code Online (Sandbox Code Playgroud)

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

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

在第二个屏幕的 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)

                    
                } ....}
Run Code Online (Sandbox Code Playgroud)

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

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

ian*_*ake 7

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

composable(route = "${Screens.RecipeDetailScreen.route}/{recipeId}") {
Run Code Online (Sandbox Code Playgroud)

您没有为recipeId参数定义任何类型。根据使用参数导航指南

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

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

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

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