每个 Activity 如果都需要手动inject(this)
有点繁琐,com.google.dagger:dagger-android
中包含AndroidInjection
类可以优化注册。
abstract class BaseActivity:AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
}
}
注意一定要在super.onCreate(savedInstanceState)
之前。其他 Activity 继承 BaseActivity 即可。
同理,BaseFragment 也要这样操作,大同小异。这里以 v4 包的 Fragment 举例:
abstract class BaseFragment:Fragment() {
override fun onAttach(context: Context?) {
AndroidSupportInjection.inject(this)
super.onAttach(context)
}
}
与 Activity 不同,这里在 onAttach 中注册。
@Subcomponent(modules = [(StudentModule::class)])
interface MainActivitySub : AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder:AndroidInjector.Builder<MainActivity>()
}
这里多说几句,StudentModule 是 Student 类对应的 Module,Student 类需要注入 MainActivity,MainActivity 继承自 BaseActivity。这几个类简单就不贴了,详情见 源码。
如果项目中有 Fragment,那么它对应的 Sub 接口这样写:
@Subcomponent(modules = [(PersonModule::class)])
interface TestFragmentSub:AndroidInjector<TestFragment>{
@Subcomponent.Builder
abstract class Builder:AndroidInjector.Builder<TestFragment>()
}
上面这两个接口都使用了 Builder 模式。
@Module(subcomponents = [(MainActivitySub::class)])
abstract class ActivityModule {
@Binds
@IntoMap
@ActivityKey(MainActivity::class)
abstract fun bindMainActivity(builder: MainActivitySub.Builder): AndroidInjector.Factory<out Activity>
}
@ActivityKey(XXXActivity::class)
subcomponents
中:@Module(subcomponents = [(XXXActivitySub::class),(YYYActivitySub::class)])
FragmentModule 也是一样的套路:
@Module(subcomponents = [(TestFragmentSub::class)])
abstract class FragmentModule {
@Binds
@IntoMap
@FragmentKey(TestFragment::class)
abstract fun bindTestFragment(builder: TestFragmentSub.Builder): AndroidInjector.Factory<out Fragment>
}
@Component(modules = [(ActivityModule::class), (FragmentModule::class)])
interface ApplicationSub {
fun inject(app: MyApp)
}
ApplicationSub 管理 ActivityModule 和 FragmentModule,而这两个类管理所有的 Activity 和 Fragment,这样,就只需要在 Application 中初始化就好了。
class MyApp : Application(), HasActivityInjector, HasSupportFragmentInjector {
@Inject
lateinit var activityInjector: DispatchingAndroidInjector<Activity>
@Inject
lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>
override fun onCreate() {
super.onCreate()
DaggerApplicationSub.create().inject(this)
}
override fun activityInjector(): DispatchingAndroidInjector<Activity> {
return activityInjector
}
override fun supportFragmentInjector(): DispatchingAndroidInjector<Fragment> {
return fragmentInjector
}
}
gradle:3.1.2 + kotlin_version = '1.2.30'
,需要在 app.gradle 里面添加apply plugin: 'kotlin-kapt'
kapt 'com.google.dagger:dagger-compiler:2.12'
implementation 'com.google.dagger:dagger-android:2.12'
implementation 'com.google.dagger:dagger-android-support:2.12'
Folder D:\workspace\Dagger2Sample-master\app\build\generated\source\kaptKotlin\debug
Folder D:\workspace\Dagger2Sample-master\app\build\generated\source\kaptKotlin\release
3rd-party Gradle plug-ins may be the cause
最后,
源码地址
其他几篇的链接:
Dagger2 中的 Qualifier
Dagger2 中的 Scope、dependencies
Dagger2 中的 SubComponent
Dagger2 中的 Binds、IntoSet、IntoMap