Android通过NavArgs传递Room实体在Fragment间跳转时App崩溃如何解决
报错根因
你遇到的java.lang.NoSuchMethodException: java.lang.Object.fromBundle报错,核心是Navigation Safe Args组件无法对自定义User类做序列化/反序列化处理,找不到对应解析方法所以向上找Object类的同名方法触发崩溃。
修复步骤
1. 给User类添加Parcelable实现
Android跨组件传递自定义对象必须实现Parcelable接口,Kotlin可以用kotlin-parcelize插件快速生成实现代码:
首先在模块级build.gradle中添加插件:
plugins { ... id 'kotlin-parcelize' id 'androidx.navigation.safeargs.kotlin' }
然后修改你的User实体类:
import android.os.Parcelable import androidx.room.Entity import androidx.room.PrimaryKey import kotlinx.parcelize.Parcelize @Parcelize @Entity(tableName = "user_table") // 保持你原来的Room注解不变 data class User( @PrimaryKey(autoGenerate = true) val id: Int, val firstName: String, val lastName: String, val age: Int ) : Parcelable
2. 修正导航图参数配置
打开你的导航图xml文件,确认UpdateFragment的参数配置中,argType填写User类的完整包名:
<fragment android:id="@+id/updateFragment" android:name="com.example.testingroomdatabase.realFragments.update.UpdateFragment" android:label="UpdateFragment"> <argument android:name="currentUser" app:argType="com.example.testingroomdatabase.model.User" app:nullable="false" /> </fragment>
注意参数名currentUser必须和你代码中调用的名称完全一致。
3. 清理重建项目
缓存会导致Safe Args无法生成正确的解析类,依次点击Android Studio顶部菜单栏 Build → Clean Project → Rebuild Project,之后重新运行应用即可。
额外检查项
如果问题仍存在,确认项目根目录build.gradle中已经添加Safe Args依赖:
buildscript { dependencies { def nav_version = "2.5.3" // 替换为你项目使用的Navigation版本 classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" } }
内容的提问来源于stack exchange,提问作者Ahmed Anwer
相关产品推荐
相关产品推荐

