NavController navigate失效:可为空List字段赋值后导航失败
我有一个接收带可为空字段模型的导航目标。此前因该可为空字段是多对多关系,可通过其他方式获取其值,所以未在API中请求该字段,此时NavController的navigate()可正常工作。如今优化流程后修复了API,开始传递该多对多字段的值,但赋值非null值后navigate()失效,之前字段为null时无此问题。两个模型均已实现Serializable接口,报错信息如下:
The fragment SomeFragment is unknown to the FragmentNavigator. Please use the navigate() function to add fragments to the FragmentNavigator managed FragmentManager
我的模型代码如下:
data class Account( @SerializedName("id") var id: String, ... some other fields @SerializedName("m2m_field") var model1s: List<Model1>?, ) : java.io.Serializable //Model1似乎不需要@SerializedName(),用于其他Retrofit调用无问题 //添加@SerializedName()到字段时反而报错 data class Model1( @PrimaryKey(autoGenerate = false) @ColumnInfo(name = "id") var id: String, @ColumnInfo(name = "created_at") var created_at: String, ... some other fields ) : java.io.Serializable
排查序列化兼容性:
虽然两个类都实现了Serializable,但嵌套的List<Model1>可能存在序列化隐患。可以尝试将List<Model1>?替换为ArrayList<Model1>?,ArrayList的序列化兼容性比抽象List更好。同时检查Model1的所有字段,确保没有未实现Serializable的嵌套对象,Room注解(如@PrimaryKey)本身不影响序列化,但自定义类型字段需确认支持序列化。检查导航参数数据量:
Navigation组件传递Serializable对象时,若数据量过大(比如model1s列表元素过多),可能导致传递失败,触发的错误信息有误导性。这种情况下建议改用ViewModel共享数据,或者只传递model1s的ID列表,在目标Fragment中重新请求完整数据,避免传递大对象。验证导航图配置:
确认导航图中目标Fragment的android:name类路径完全正确,没有拼写错误;同时检查导航动作的app:destination是否指向正确的Fragment ID,确保没有配置错误。临时验证步骤:
先强制将model1s设为null,调用navigate()测试是否正常。如果正常,说明问题确实出在该字段的非null值传递上,再针对性排查序列化或数据量问题。
内容的提问来源于stack exchange,提问作者rminaj

