在 android Navigation deeplink 错误:数组不支持默认值

Posted

技术标签:

【中文标题】在 android Navigation deeplink 错误:数组不支持默认值【英文标题】:in android Navigation deeplink Error: Arrays don't support default values 【发布时间】:2022-01-06 01:08:45 【问题描述】:

我有一个这样的深层链接:

 <deepLink
    android:id="@+id/applink_one"
    app:uri="https://sample.com/arg1/?arg2=arg2" />

并像这样定义参数:

<argument
    android:name="arg1"
    app:argType="string" />

<argument
    android:name="arg2"
    android:defaultValue="@null"
    app:argType="string[]"
    app:nullable="true"
    />

调用时:

https://sample.com/tags/?arg2=test&arg2=toast

我收到此错误并退出应用程序:

Caused by: android.view.InflateException: Binary XML file line #19 in com.sample.app:layout/activity_nav_host: Error inflating class androidx.fragment.app.FragmentContainerView

Caused by: java.lang.UnsupportedOperationException: Arrays don't support default values.

我无法检测到错误。

“数组不支持默认值。”?

我能做什么?

我的导航版本:

androidx.navigation:navigation-fragment-ktx:2.2.0
androidx.navigation:navigation-ui-ktx::2.2.0
androidx.navigation:navigation-safe-args-gradle-plugin:2.2.0

整个堆栈跟踪:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.sample.app, PID: 24284
    java.lang.RuntimeException: Unable to start activity ComponentInfocom.sample.app/com.sample.app.presentation.NavHostActivity: android.view.InflateException: Binary XML file line #19 in com.sample.app:layout/activity_nav_host: Binary XML file line #19 in com.sample.app:layout/activity_nav_host: Error inflating class androidx.fragment.app.FragmentContainerView
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3835)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4011)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2325)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:246)
        at android.app.ActivityThread.main(ActivityThread.java:8633)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
     Caused by: android.view.InflateException: Binary XML file line #19 in com.sample.app:layout/activity_nav_host: Binary XML file line #19 in com.sample.app:layout/activity_nav_host: Error inflating class androidx.fragment.app.FragmentContainerView
     Caused by: android.view.InflateException: Binary XML file line #19 in com.sample.app:layout/activity_nav_host: Error inflating class androidx.fragment.app.FragmentContainerView
     Caused by: java.lang.UnsupportedOperationException: Arrays don't support default values.
        at androidx.navigation.NavType$11.parseValue(NavType.java:623)
        at androidx.navigation.NavType$11.parseValue(NavType.java:609)
        at androidx.navigation.NavType.parseAndPut(NavType.java:96)
        at androidx.navigation.NavDeepLink.parseArgument(NavDeepLink.java:187)
        at androidx.navigation.NavDeepLink.getMatchingArguments(NavDeepLink.java:174)
        

【问题讨论】:

请包括整个堆栈跟踪以及您使用的导航版本。 @ianhanniballake 已更新。 您是否尝试过使用更新版本的导航? Navigation 2.2 在这一点上已经快两年了。 Navigation 2.3.5 是最新的稳定版,2.4.0-beta02 是目前最新的版本。 现在我正在与 2.4.0-beta02 同步 ... 已更新,但仍显示“数组不支持默认值。” 【参考方案1】:

删除这个错误的默认值,不能为[]类型设置:

android:defaultValue="@null"
app:nullable="true"

它还显示R.layout.activity_nav_host,行#19 ...这可能是在哪里看。


否则深层链接将通过String[]

https://sample.com/tags/?arg2=[test,toast]

【讨论】:

不,我试过了,但没有任何改变 深层链接引用arg2= 两次......所以你没有正确调用它。上述错误默认值可能会出现更多情况,不能为[]类型设置。 不,这不是错字,我想将 arg2 作为值列表处理;在我的示例中:“sample.com/tags/?arg2=test&arg2=toast”,arg1 等于标签,arg2 将是测试和 toast 的列表:[“test”,“toast”]。但是,它也会因调用“sample.com”而崩溃。 deep-link 是一个错字,因为这不是创建输入数组的首选方式......当使用两次时,服务器端可能只注册最后一个(在至少在 php 中,不确定如何为深层链接实现 URL 方案)。这个“默认”值可能来自第一个 arg2,第二个 arg2 试图改变它。 也许app:uri URL 方案已经必须代表数组输入?这至少是模式的来源。

以上是关于在 android Navigation deeplink 错误:数组不支持默认值的主要内容,如果未能解决你的问题,请参考以下文章

Android Navigation 详解

Android Navigation 详解

Android Studio navigation 一直在Loading为啥?

Expo Android 应用程序在 navigation.navigate() 上崩溃

Android开发 navigation入门详解

Android日志—Navigation