首页 文章

Android Kotlin Dagger2提供gson:指定为非null的参数为null

提问于
浏览
0

我想提供一个单独的gson实例,所以我在我的NetworkModule中提供它,当我创建改装api时,gson是非null,但是当我在改装类中使用gson实例时,它是null .

@Module
    class NetworkModule {

        @Provides
        @Singleton
        fun provideGson(): Gson {
            return Gson()
        }

        @Provides
        @Singleton
        fun provideMyEnterpriseApi(gson: Gson): MyEnterpriseApi {

            //HERE GSON IS NOT NULL

            return RetrofitMyEnterpriseApi(BuildConfig.API_MYENTERPRISE_URL,
                    BuildConfig.API_MYENTERPRISE_CONNECTION_TIMEOUT,


       BuildConfig.API_MYENTERPRISE_READ_TIMEOUT,
                gson)
    }
}

我的改装api类:

class RetrofitMyEnterpriseApi(baseUrl: String, connectTimeout: Long, readTimeout: Long, private val gson: Gson)
    : RetrofitApi<RetrofitMyEnterpriseCalls>(baseUrl, connectTimeout, readTimeout, RetrofitMyEnterpriseCalls::class.java) {

    override fun buildRetrofit(baseUrl: String, connectTimeout: Long, readTimeout: Long): Retrofit {
        val builder = Retrofit.Builder()

        builder.baseUrl(baseUrl)
        builder.client(buildClient(connectTimeout, readTimeout))
        builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        builder.addConverterFactory(GsonConverterFactory.create(gson))

        return builder.build()
    }

    private fun buildClient(connectTimeout: Long, readTimeout: Long): OkHttpClient {

        //HERE GSON IS NULL

        return OkHttpClient.Builder()
                .addInterceptor(OAuth2Interceptor(gson, this))
                .addInterceptor(LoggingInterceptor.newInstance())
                .connectTimeout(connectTimeout, TimeUnit.MILLISECONDS)
                .readTimeout(readTimeout, TimeUnit.MILLISECONDS)
                .build()
    }
}

RetrofitApi类:

abstract class RetrofitApi<C>
(baseUrl: String, connectTimeout: Long, readTimeout: Long, callsClass: Class<C>) {

    protected val calls: C

    init {
        val retrofit = buildRetrofit(baseUrl, connectTimeout, readTimeout)

        calls = retrofit.create(callsClass)
    }

    protected abstract fun buildRetrofit(baseUrl: String, connectTimeout: Long, readTimeout: Long): Retrofit
}

所以,当我提供它不是null时,但是当我在buildClient方法中使用它是null时,我不明白为什么,我想念Kotlin中的某些东西 .

1 回答

  • 1

    我发布时发现了答案\ o /

    所以问题是RetrofitMyEnterpriseApi类中的gson字段是在RetrofitApi父类的init之后实现的,我认为这很奇怪,因为我在参数中传递它但是..

    我只需要在初始化RetrofitMyEnterpriseApi类之后调用我的buildRetrofit方法,或者将gson实例发送到我的父类 .

相关问题