首页 > 解决方案 > 如何将 Apollo-android 合并到具有多个模块的项目中?

问题描述

我有一个使用 graphql 与服务器通信的 Android 项目。

它有很多模块。每个都有自己的 graphql 查询/突变,但它们共享相同的模式。

目前,我遇到了 Apollo 自动生成多个type.CustomType类的问题,并且似乎顶级“app”模块将type.CustomType使用任意模块的实现进行编译。

根据模块的查询,内容会type.CustomType有所不同,因此FieldNotFoundException即使我没有使用反射并且项目编译良好,也会出现崩溃。

例如

java.lang.NoSuchFieldError: No static field LONG of type Lapi/type/CustomType; in class Lapi/type/CustomType; or its superclasses (declaration of 'api.type.CustomType' appears in /data/app/com.functorz.app-oV7ixVEf0e0CIt1sWzT4uA==/base.apk!classes6.dex)
        at com.functorz.network.GraphQLRequestUtil.initialSubscriptionClient(GraphQLRequestUtil.java:151)
        at com.functorz.network.GraphQLRequestUtil.<init>(GraphQLRequestUtil.java:111)
        at com.functorz.network.GraphQLRequestUtil.<clinit>(GraphQLRequestUtil.java:48)
        at com.functorz.network.GraphQLRequestUtil.getInstance(GraphQLRequestUtil.java:162)

GraphQLRequestUtil 第 151 行的代码非常简单,它是引用 CustomType 的第一行,即

.addCustomTypeAdapter(CustomType.LONG, TypeUtil.LONG_TYPE_ADAPTER)

apolloSubscriptionClient = ApolloClient.builder()
        .serverUrl(subscriptionUrl)
        .okHttpClient(subscriptionOkHttpClient)
        .subscriptionTransportFactory(new WebSocketSubscriptionTransport.Factory(socketUrl, subscriptionOkHttpClient))
        .addCustomTypeAdapter(CustomType.LONG, TypeUtil.LONG_TYPE_ADAPTER)
        .addCustomTypeAdapter(CustomType.OFFSETDATETIME, TypeUtil.DATE_TIME_TYPE_ADAPTER)
        .addCustomTypeAdapter(CustomType.LOCALDATE, TypeUtil.LOCAL_DATE_TYPE_ADAPTER)
        .addCustomTypeAdapter(CustomType.SQLDATE, TypeUtil.SQL_DATE_TYPE_ADAPTER)
        .addCustomTypeAdapter(CustomType.URL, TypeUtil.URL_TYPE_ADAPTER)
        .addCustomTypeAdapter(CustomType.BIGDECIMAL, TypeUtil.DECIMAL_TYPE_ADAPTER)
        .build();

我认为我错误地模块化了我的项目。当所有模块都依赖于 Apollo 时,是否有人对如何将项目拆分为多个模块有建议?

标签: javaandroidgraphqlapolloapollo-android

解决方案


推荐阅读