在实现传参方案的过程中,在模块之间的导航中,遇到了序列化错误。据我所知,深层链接接受自定义参数类型,即 Parcelables 或 Serialized。
我正在使用最新版本的导航2.2.0
错误信息:
java.lang.UnsupportedOperationException:Parcelables 不支持默认值。
我做错了什么还是这个还在开发中?
这是一个简短的例子:
<fragment
android:id="@+id/sampleFragment"
android:name="com.testapp.app.samples.navigation.SampleFragment"
android:label="SampleFragment">
<argument
android:name="Args"
app:argType="com.testapp.navigation.SampleArgs" />
<deepLink app:uri="app://app/samples/navigation/SampleFragment?Args={Args}"/>
</fragment>
@Parcelize
@Keep data class SampleArgs(
val text: String
) : NavArgs, Parcelable
val x = SampleArgs("TEST")
val uri = Uri.parse("app://app/samples/navigation/SampleFragment?Args=$x")
navController.navigate(uri)
我在这里发现了类似的东西Android Parcelable不支持默认值应用程序崩溃
这是我在堆栈上的第一篇文章,所以请温柔:)
编辑
这是答案:
Parcelables 目前不支持默认值,因此您需要将对象作为字符串值传递。是的,这是一个解决方法。因此,我们可以将该对象转换为 JSON(字符串)并通过导航传递,然后将该 JSON 解析回目标处的对象,而不是将对象本身作为 Parcelize 对象传递。您可以使用
GSON
进行对象到 json 字符串的转换。
我知道这是任何标准应用程序的常见模式。但我想坚持使用 Android 推荐,这将使设计更简单、更简单。如果您要在屏幕上传递复杂的数据,则需要在设计上进行一些改进。
根据以下文档 https://developer.android.com/jetpack/compose/navigation#retriving-complex-data
强烈建议在导航时不要传递复杂的数据对象,而是在执行导航操作时传递最少的必要信息,例如唯一标识符或其他形式的 ID,作为参数:
// Pass only the user ID when navigating to a new destination as argument
navController.navigate("profile/user1234")
复杂对象应作为数据存储在单一事实来源中,例如数据层。导航后抵达目的地后,您可以使用传递的 ID 从单一事实来源加载所需信息
我觉得确实很有道理。所以我会代替你做的是相应地改变设计,你稍后就会看到好处......:)