【问题标题】:Using Serializable as deep link argument with Android Navigation Component将 Serializable 用作 Android 导航组件的深层链接参数
【发布时间】:2020-03-02 21:00:23
【问题描述】:

在使用深层链接时是否可以使用自定义 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)

将 type 替换为 long (app:argType="long") 即可解决问题 - 没有异常,一切正常。

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

【问题讨论】:

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


    【解决方案1】:

    据我所知,除了您所做的事情之外,您只有另一种选择:Parcelable

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

    特别是我可以看到您正在使用 Kotlin,它有一个帮助方法可以正确实现它,请参阅:Parcelize

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

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

    旁注: 出于各种原因,不鼓励使用 Serializable 接口。摘自长期从事Java工作的Joshua Bloch所写的Effective Java一书:

    Item 85: Prefer alternatives to Java serialization
    

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

    【讨论】:

    猜你喜欢
    • 2020-05-15
    • 2020-05-30
    • 2021-08-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2020-07-13
    相关资源
    最近更新 更多