1

我需要将自定义对象从一个片段传递到另一个片段。我使用 androidx 导航在片段之间进行导航。我不得不deepLink为我的用例使用导航。

带有目标片段的导航图有,

    <fragment
       android:id="@+id/ListFragment"
       android:name="com.joseph.learning.ListFragment"
       android:label="ListFragment">
    
       <argument android:name="todoItem"
        app:argType="com.joseph.learning.models.todoItem" />

      <deepLink app:uri="android-app://androidx.navigation/todoList/{todoItem}" />
  </fragment>

从源片段开始,导航就像

findNavController().navigate(
  Uri.parse("android-app://androidx.navigation/todoList/$item"),
  NavOptions.Builder()
      .setEnterAnim(R.anim.transition_slide_in_right)
      .setExitAnim(R.anim.transition_slide_out_left)
      .setPopExitAnim(R.anim.transition_slide_out_right)
      .setPopEnterAnim(R.anim.transition_slide_in_left)
      .build()
 )

但是一旦执行并出现以下错误,这就会失败

java.lang.UnsupportedOperationException: Parcelables don't support default values.
        at androidx.navigation.NavType$ParcelableType.parseValue(NavType.java:679)
        at androidx.navigation.NavType.parseAndPut(NavType.java:96)
        at androidx.navigation.NavDeepLink.parseArgument(NavDeepLink.java:306)
        ...

如果 incase 将自定义对象作为参数替换为字符串或整数,则导航可以正常工作。也可以使用在目标片段中提取传递的数据navArgs()

应该怎么做才能跨片段传递自定义对象?

4

1 回答 1

0

安卓文档

可以从字符串中解析路由、深层链接和带有参数的 URI。如上表所示,使用 Parcelables 和 Serializables 等自定义数据类型是不可能的。

解决方案:要传递自定义复杂数据,将数据存储在其他地方,例如 ViewModel 或数据库,并且只在导航时传递标识符;然后在导航结束后在新位置检索数据。

于 2022-02-09T05:27:26.383 回答