在Androidx Navigation的路由中设置一个可选的整型参数(IntType)
我在应用中使用 Androidx Navigation 作为路由器,然而我有很多不同的路由,其中一个路由带有形如:route?$sectionArg={$sectionArg}&itemId={$itemId} 的参数。例如,这个导航目标的一个路由可以是:myapp://catalog?section=books&itemId=69
我想让itemId参数成为「可选的」,也就是可以导航到形如:
myapp://catalog?section=books
但在定义参数时,我必须这样写:
composable(
route = CatalogDestination.routeWithArgs,
arguments = listOf(
navArgument(CatalogDestination.sectionArg) {
type = NavType.StringType
defaultValue = "Books"
},
navArgument(PlantSheetDestination.itemId) {
type = NavType.IntType
defaultValue = -1
}
),
因为如果不设置默认值,就会出现运行时错误,类似于:
java.lang.IllegalArgumentException: Deep link myapp://catalog?section=Books can't be used to open destination Destination(0x0).
Following required arguments are missing: [itemId]
此外,我不能把该参数设为可空,因为NavArgument的 IntType不允许这样。 实际上:
navArgument(PlantSheetDestination.itemId) {
type = NavType.IntType
nullable = true
}
会抛出:
java.lang.IllegalArgumentException: integer does not allow nullable value
请注意,我并没有使用 [Safe Args]。
解决方案
我将NavType的定义改为IntArrayType(它是可空的):
navArgument(PlantSheetDestination.itemId) {
type = NavType.IntArrayType
nullable = true
}
现在我可以省略那个 itemId 参数,而不会有错误。
此外,路由的语法仍然可以是:myapp://catalog?section=Books&itemId=69
唯一需要注意的是,在收集参数时,必须使用IntArray类型并调用getIntArray函数,像这样:
val itemParams: IntArray? =
backStackEntry.arguments?.getIntArray(PlantSheetDestination.itemId)
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。