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()
第一个屏幕,将id
Int 类型传递到导航路线中。
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 时为我指明正确的方向。
当您将第二个屏幕定义为:
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>
实际上有一个Int
to find,而不是一个String
.
归档时间: |
|
查看次数: |
1581 次 |
最近记录: |