Android Deep Link传递字符串数组报错,求正确参数格式
解决Android Deep Link传递字符串数组参数的报错问题
错误原因分析
你遇到的"Arrays don't support default values."错误,直接原因是Navigation组件不允许为数组类型的参数设置默认值——哪怕是@null也不行。另外你当前的Deep Link构建方式也有问题:直接拼接数组$subCategories会生成类似[xxx, yyy]的字符串,不符合URI规范,同时Navigation也无法将其解析为字符串数组。
分步解决方案
1. 移除数组参数的默认值配置
修改导航XML中的subCategories参数,删除android:defaultValue="@null":
<deepLink android:autoVerify="true" app:action="android.intent.action.VIEW" app:uri="my-app://com.app/venues/{category}?subCategories={subCategories}" /> <argument android:name="subCategories" app:argType="string[]" app:nullable="true" /> <argument android:name="category" app:argType="string" />
2. 正确构建带数组参数的Deep Link
将数组参数放在查询参数中,而非路径参数里。推荐用逗号分隔数组元素,或者重复参数名的方式:
方式1:逗号分隔数组元素
fun byCategoryDeepLink( category: String, subCategories: Array<String> ) = DeepLink("my-app://com.app/venues/${category}?subCategories=${subCategories.joinToString(",")}")
方式2:重复查询参数名
fun byCategoryDeepLink( category: String, subCategories: Array<String> ): DeepLink { val queryString = subCategories.joinToString("&") { "subCategories=$it" } return DeepLink("my-app://com.app/venues/${category}?$queryString") }
3. 在目的地解析数组参数
Navigation默认的string[]类型无法自动解析逗号分隔或重复参数,需要手动处理:
针对逗号分隔的情况
// 在目标Fragment中解析 val args = VenuesFragmentArgs.fromBundle(requireArguments()) val subCategories = args.subCategories?.split(",")?.toTypedArray() ?: emptyArray()
针对重复参数的情况
// 在目标Fragment中解析 val subCategories = requireActivity().intent.getStringArrayExtra("subCategories") ?: emptyArray()
内容的提问来源于stack exchange,提问作者Daniel sims
相关产品推荐
相关产品推荐

