Android项目中如何让Apollo GraphQL自动生成类实现Parcelable
嘿,我刚好踩过这个坑!Apollo自动生成的GraphQL模型类默认确实没实现Parcelable,不过有几个简单靠谱的办法能解决,我给你一一拆解:
方法1:让Apollo自动生成Parcelable实现(最省心)
这是首选方案,直接通过Gradle配置让Apollo在生成模型类的时候就自带Parcelable支持,不用自己写任何额外代码。
- 打开你app模块的
build.gradle.kts(如果是Groovy就用build.gradle),找到Apollo的配置块,添加generateParcelableModels.set(true):apollo { service("your-service-name") { packageName.set("com.your.app.graphql") // 关键配置:开启Parcelable自动生成 generateParcelableModels.set(true) } } - 同步Gradle后重新构建项目,你会发现所有自动生成的GraphQL类都已经实现了
Parcelable接口,writeToParcel()、CREATOR这些必要方法也都帮你生成好了,直接就能用Intent.putExtra()传递对象了。
方法2:给特定类写Parcelable包装类(按需处理)
如果你不想全局开启Parcelable生成,或者只需要给个别类加支持,可以自己写一个Parcelable包装类来包裹Apollo生成的对象:
- 假设你有个自动生成的
Post类,写个包装类:class PostParcelableWrapper(val post: Post) : Parcelable { // 从Parcel读取的构造方法 constructor(parcel: Parcel) : this( Post.CREATOR.createFromParcel(parcel) ) override fun writeToParcel(parcel: Parcel, flags: Int) { post.writeToParcel(parcel, flags) } override fun describeContents(): Int { return 0 } companion object CREATOR : Parcelable.Creator<PostParcelableWrapper> { override fun createFromParcel(parcel: Parcel): PostParcelableWrapper { return PostParcelableWrapper(parcel) } override fun newArray(size: Int): Array<PostParcelableWrapper?> { return arrayOfNulls(size) } } } - 传递对象时:
val intent = Intent(this, DetailActivity::class.java) intent.putExtra("POST_WRAPPER", PostParcelableWrapper(yourPostObject)) startActivity(intent) - 接收时:
val wrapper = intent.getParcelableExtra<PostParcelableWrapper>("POST_WRAPPER") val post = wrapper?.post
方法3:用Kotlin的@Parcelize简化包装类(Kotlin项目专属)
如果你的项目用Kotlin,还可以借助kotlin-parcelize插件来简化包装类的写法,不用手动写Parcelable的方法:
- 先确保在app模块的Gradle里开启插件:
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("kotlin-parcelize") // 启用Parcelize插件 } - 然后写包装类,只用一行核心代码:
Kotlin会自动帮你生成所有Parcelable相关的方法,非常简洁!@Parcelize class PostParcelableWrapper(val post: Post) : Parcelable
注意事项
- 以上方案适用于Apollo 3.x版本;如果是2.x旧版本,配置项会略有不同(比如
generateParcelableModels在2.x里是generateParcelable),建议尽量升级到最新版的Apollo客户端。 - 用方法1的话,Apollo会自动处理所有嵌套的模型类,不用担心嵌套对象无法序列化的问题。
内容的提问来源于stack exchange,提问作者chathura
相关产品推荐
相关产品推荐

