使用Dagger 2提供应用程序上下文

时间:2018-12-20 10:34:57

标签: android kotlin dagger-2

大家好,

我想为我的AppModule类提供应用程序上下文。

我希望像我使用ApiService类一样在整个应用程序中提供PrefsHelper。

我的AppModule的代码:

@Module
@Suppress("unused")
object AppModule {

    @Provides
    @Reusable
    @JvmStatic
    internal fun provideApiService(retrofit: Retrofit): ApiService {
        return retrofit.create(ApiService::class.java)
    }

    /**
     * Provides the Retrofit object.
     * @return the Retrofit object
     */
    @Provides
    @Reusable
    @JvmStatic
    internal fun provideRetrofitInterface(): Retrofit {
    val interceptor: HttpLoggingInterceptor = HttpLoggingInterceptor().apply {
        this.level = HttpLoggingInterceptor.Level.BODY
    }
    val client: OkHttpClient = OkHttpClient.Builder().apply { this.addInterceptor(interceptor) }.build()
    return Retrofit.Builder()
            .baseUrl(BuildConfig.BASE_URL)
            .client(client)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
            .addConverterFactory(GsonConverterFactory.create())
            .build()
}

我以前在Java中看到的方法是创建一个构造函数,并以这种方式传入应用程序上下文。 Kotlin不允许使用object

如何在此类中提供上下文,以允许我提供PrefsHelper?

2 个答案:

答案 0 :(得分:0)

将您的AppModule更改为以下内容:

@Module
class AppModule(private val application: Application) {

    @Singleton
    @Provides
    internal fun provideApplication(): Application = application

    @Singleton
    @Provides
    internal fun providePrefs(application: Application): YourPref {
        return YourPref(application)
    }

}

答案 1 :(得分:0)

您还可以在AppComponent中使用BindsInstance注释。

因此您的AppComponent看起来像这样:

@Singleton
@Component(modules = YOUR_MODULES)
interface AppComponent {

//Whatever injections you have

   @Component.Builder
   interface Builder {

      fun build(): AppComponent

      @BindsInstance 
      fun application(Application application): Builder      
  }
}

然后,您只需将新方法添加到AppComponent中的Application class创建中即可。

DaggerAppComponent.builder().application(this).build()