将子组件实例放入活动中

Jam*_*mol 5 android kotlin dagger-2

AppComponent

@PerApplication
@Component(modules = arrayOf(AppModule::class))
interface AppComponent {
}
Run Code Online (Sandbox Code Playgroud)

AppModule

@Module(subcomponents = arrayOf(ActivityComponent::class))
class AppModule(private val context: Context) {

  @Provides @PerApplication
  fun provideContext() = context

  @Provides @PerApplication
  fun provideSharedPreferences(context: Context)
      = context.getSharedPreferences("${context.packageName}.preferences", Context.MODE_PRIVATE)

  @Provides @PerApplication
  fun provideMoshi() = Moshi.Builder().build()

  @Provides @PerApplication
  fun provideRetrofit(moshi: Moshi): Retrofit {
    return Retrofit.Builder()
        .baseUrl("https://reqres.in")
        .addConverterFactory(MoshiConverterFactory.create(moshi))
            .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()))
        .build()
  }
}
Run Code Online (Sandbox Code Playgroud)

ActivityComponent

@PerActivity
@Subcomponent(modules = arrayOf(ActivityModule::class))
interface ActivityComponent {

  fun inject(activity: MainActivity)

  @Subcomponent.Builder
  interface Builder {
    fun activityModule(module: ActivityModule): Builder
    fun build(): ActivityComponent
  }
}
Run Code Online (Sandbox Code Playgroud)

ActivityModule

@Module
class ActivityModule(private val activity: FragmentActivity) {

  @Provides @PerActivity
  fun provideActivity() = activity

  @Provides @PerActivity
  fun provideTestApi(retrofit: Retrofit) = retrofit.create(TestApi::class.java)
}
Run Code Online (Sandbox Code Playgroud)

如何获得ActivityComponentinto的 Builder 实例MainActivity

活动是由 Dagger 创建的,所以我不能像官方文档中给出的例子那样将提供者注入到构造函数中。

我尝试使用 dagger-2.7 之前的方式创建子组件,方法是将以下行添加到AppComponent

fun activityComponent(module: ActivityModule): ActivityComponent
Run Code Online (Sandbox Code Playgroud)

并在MainActivity

(application as App).appComponent.activityComponent(ActivityModule(this)).inject(this)
Run Code Online (Sandbox Code Playgroud)

这给了我:

错误:[com.example.injection.ActivityComponent.inject(com.example.modules.main.MainActivity)] com.example.api.TestApi 不能在没有 @Provides 注释的方法的情况下提供。