我应该如何将 Dagger2 与 Retrofit 一起使用?

Dav*_*vid 4 android kotlin retrofit dagger-2

我在一个项目中工作,我需要用 Dagger 2 注入 Retrofit 对象。我搜索了信息,但我只能执行几个步骤,现在我不知道如何继续:

我的组件:

@Singleton
@Component(modules = arrayOf(NetworkModule::class))
interface NetworkComponent {
    fun inject(foo: TheApplication)
}
Run Code Online (Sandbox Code Playgroud)

我的模块:

@Module
class NetworkModule {

    @Provides
    @Singleton
    fun provideRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl("https://api.chucknorris.io/")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()
    }

}
Run Code Online (Sandbox Code Playgroud)

现在我看到我必须创建一个Classwho 扩展自Applicationfor initComponent并创建一个@Inject下一个:

class TheApplication: Application() {

    override fun onCreate() {
        super.onCreate()
        val net: NetworkModule = Dagger...
    }
}
Run Code Online (Sandbox Code Playgroud)

从理论上讲,当我把Dagger...它放在应该是DaggerNetworkComponent但我重建项目时仍然丢失。任何人都可以向我解释它的Application.class用途以及我如何继续?

Mad*_*ddy 6

尝试这个

应用组件.kt

@Component(modules = [NetworkModule::class]) 
@Singleton 
interface AppComponent {
    fun inject(app: MyApp)
}
Run Code Online (Sandbox Code Playgroud)

网络模块.kt

@Module
class NetworkModule {

    @Singleton
    @Provides
    fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
        return Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl("YOUR_BASE_URL")
            .client(okHttpClient)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()
    }

    @Singleton
    @Provides
    fun provideApi(retrofit: Retrofit): WebApi {
        return retrofit.create(WebApi::class.java)
    }

    @Singleton
    @Provides
    fun provideOkHttpClient(
        interceptors: ArrayList<Interceptor>
    ): OkHttpClient {
        val clientBuilder = OkHttpClient.Builder()
            .followRedirects(false)
        interceptors.forEach {
            clientBuilder.addInterceptor(it)
        }
        return clientBuilder.build()
    }


    @Singleton
    @Provides
    fun provideInterceptors(): ArrayList<Interceptor> {
        val interceptors = arrayListOf<Interceptor>()
        val loggingInterceptor = HttpLoggingInterceptor().apply {
            level = if (BuildConfig.DEBUG) {
                HttpLoggingInterceptor.Level.BODY
            } else {
                HttpLoggingInterceptor.Level.NONE
            }
        }
        interceptors.add(loggingInterceptor)
        return interceptors
    }
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序

class MyApp : Application() {
    companion object {
        lateinit var instance: MyApp
            private set
    }

    lateinit var appComponent: AppComponent
        private set


    override fun onCreate() {
        super.onCreate()
        instance = this
        initComponent()
    }

    private fun initComponent() {
        appComponent = DaggerAppComponent.builder()
            .build()
        appComponent.inject(this)
    }
}
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml

<application
            android:name=".MyApp"
            ....
Run Code Online (Sandbox Code Playgroud)