You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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插件
    }
    
  • 然后写包装类,只用一行核心代码:
    @Parcelize
    class PostParcelableWrapper(val post: Post) : Parcelable
    
    Kotlin会自动帮你生成所有Parcelable相关的方法,非常简洁!

注意事项

  • 以上方案适用于Apollo 3.x版本;如果是2.x旧版本,配置项会略有不同(比如generateParcelableModels在2.x里是generateParcelable),建议尽量升级到最新版的Apollo客户端。
  • 用方法1的话,Apollo会自动处理所有嵌套的模型类,不用担心嵌套对象无法序列化的问题。

内容的提问来源于stack exchange,提问作者chathura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:14:41