【发布时间】:2017-10-19 17:51:09
【问题描述】:
我正在尝试将 dagger 和 kotlin 和 mvvm 合二为一,所以如果这个问题很奇怪,请原谅我。
如果我有一个 NetworkModule,它基本上为应用程序提供改造,我认为传入我们想要构建改造的基本 url 是一个好主意。我可以通过应用程序的组件构建函数以 old 的方式进行操作,但不知道如何通过@Component.Builder 方法进行操作。尝试:
App.kt
DaggerAppComponent.builder()
.application(this)
.networkModule(BuildConfig.BASE_URL)
.build()
.inject(this)
AppComponent.kt
@Singleton
@Component(modules = arrayOf(
AppModule::class,
NetworkModule::class,
AndroidInjectionModule::class,
ActivityBuilder::class))
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
@BindsInstance
fun networkModule(baseUrl: String): Builder
fun build(): AppComponent
}
fun inject(app: App)
}
NetworkModule.kt
@Module
class NetworkModule(baseUrl: String) {
//Attempt to force a public setter for Dagger
var baseUrl: String = baseUrl
set
@Provides
@Singleton
fun provideHttpLoggingInterceptor(): HttpLoggingInterceptor {
val loggingInterceptor = HttpLoggingInterceptor { message -> Timber.d(message) }
loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
return loggingInterceptor
}
@Provides
@Singleton
fun provideOkHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
val httpClientBuilder = OkHttpClient.Builder()
if (BuildConfig.DEBUG) httpClientBuilder.addInterceptor(httpLoggingInterceptor)
return httpClientBuilder.build()
}
@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
}
}
错误很清楚,但我仍然不明白它的含义:)
@Component.Builder is missing setters for required modules or components: [core.sdk.di.module.NetworkModule]。我试图强制模块为基本 url 创建一个公共设置器(尽管我认为这不是必需的)。
【问题讨论】:
标签: android dependency-injection kotlin dagger-2