请帮帮我!我在使用Dagger 2时遇到了麻烦。
我想在MainActivity
中使用@Subcomponent.Builder
和@BindsInstance
,在运行时而不是编译时绑定一些依赖项。
我有一个ApplicationComponent,它有一个Builder,在使用@BindsInstance
时没有问题。我可以像下面这样使用:
DaggerApplicationComponent
.builder()
.application(this)
.build()
.inject(this)
但是一些麻烦来自MainActivity...
以下是代码片段
[ApplicationComponent]
@Singleton
@Component(modules = [ApplicationModule::class])
internal interface ApplicationComponent : AndroidInjector<MyApplication> {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): ApplicationComponent
}
}
[应用程序模块]
@Module(
includes = [
AndroidInjectionModule::class,
AndroidSupportInjectionModule::class,
ActivityInjectionModule::class
],
subcomponents = [
MainComponent::class
]
)
internal abstract class ApplicationModule {
@PerActivity
@ContributesAndroidInjector(modules = [SplashModule::class])
abstract fun splashActivity(): SplashActivity
@Binds
@IntoMap
@ActivityKey(MainActivity::class)
abstract fun mainActivity(builder: MainComponent.Builder): AndroidInjector.Factory<out Activity>
}
[主要组件]
@PerActivity
@Subcomponent(modules = [MainModule::class])
internal interface MainComponent : AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder : AndroidInjector.Builder<MainActivity>() {
@BindsInstance
abstract fun testClass(mainTestClass: MainTestClass): Builder
}
}
[MainActivity]
internal class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// This works find without runtime injection
// AndroidInjection.inject(this)
/**
*I want to bind some dependency(in this case, MainTestClass) in runtime like below.
* so that I can use MainTestClass inside MainModule to inject this to other classes.
* but, for some reason,
* DaggerMainComponent IS NOT GENERATED AUTOMATICALLY...
*/
DaggerMainComponent.builder()
.testClass(MainTestClass())
.build()
.inject(this);
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
startActivity(Intent(this, SplashActivity::class.java))
}
}
问题在于我无法访问DaggerMainComponent,因为Dagger没有自动生成它。我浏览了很多网站来解决这个问题,但都失败了。有没有什么方法可以解决呢?
MainTestClass
是什么?为什么需要在运行时而不是编译时确定它?如果它与测试有关,正如情况所示,为什么不将其绑定到根组件? - AutonomousApps