在Android导航组件中将Serializable作为深度链接参数使用

时间:2019-11-06 11:27:08

标签: android android-navigation android-architecture-navigation android-jetpack-navigation android-deep-link

使用深层链接时,是否可以将自定义Serializable对象用作片段参数?

我尝试了以下操作-在导航图XML文件中,添加了以下几行:

<fragment
    android:id="@+id/eventFragment"
    android:name="com.myapp.EventFragment"
    android:label="EventFragment">

    <argument
        android:name="event"
        app:argType="com.myapp.EventId" />

    <deepLink app:uri="myapp://event/{event}" />

</fragment>

EventId是可序列化的数据类:

data class EventId(val value: Long) : Serializable

然后,当我尝试使用URL myapp://event/4002运行我的应用程序时,将引发以下异常:

Caused by: java.lang.UnsupportedOperationException: Serializables don't support default values.
        at androidx.navigation.NavType$SerializableType.parseValue(NavType.java:834)
        at androidx.navigation.NavType$SerializableType.parseValue(NavType.java:787)
        at androidx.navigation.NavType.parseAndPut(NavType.java:96)
        at androidx.navigation.NavDeepLink.getMatchingArguments(NavDeepLink.java:99)
        at androidx.navigation.NavDestination.matchDeepLink(NavDestination.java:366)
        at androidx.navigation.NavGraph.matchDeepLink(NavGraph.java:79)
        at androidx.navigation.NavController.handleDeepLink(NavController.java:540)
        at androidx.navigation.NavController.onGraphCreated(NavController.java:499)
        at androidx.navigation.NavController.setGraph(NavController.java:460)
        at androidx.navigation.NavController.setGraph(NavController.java:425)
        at androidx.navigation.NavController.setGraph(NavController.java:407)
        at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:236)

longapp:argType="long")替换类型可以解决此问题-没有异常,一切都按预期进行。

似乎导航库不知道如何将原始值从URL转换为我的EventId类。是否可以通过某种方式注册知道如何转换的适配器?也许还有另一种解决方案?

1 个答案:

答案 0 :(得分:0)

据我所知,您只能做另一种选择:Parcelable

我认为在这种情况下就足够了,但是我不确定,但是即使这样还不行,这对于将来的任何Android开发都是一个很好的建议,例如当您需要在“活动”或“片段”之间发送数据时

尤其是,正如我所看到的,您正在使用Kotlin,它具有用于正确实现它的辅助方法,请参见:Parcelize

有了它,您的数据类将看起来像这样:

@Parcelize
data class EventId(val value: Long) : Parcelable

旁注: 出于各种原因,不建议使用Serializable接口。摘自Effective Java写的Joshua Bloch这本书,他从事Java已有很长时间了。

Item 85: Prefer alternatives to Java serialization

如果仍然需要使用Serializable,则本书将介绍必要的细节。