每个 Activity 如果都需要手动inject(this)
有点繁琐,com.google.dagger:dagger-android
中包含AndroidInjection
类可以优化注册。
1.在 BaseActivity 中注册
1 | abstract class BaseActivity:AppCompatActivity() { |
注意一定要在super.onCreate(savedInstanceState)
之前。其他 Activity 继承 BaseActivity 即可。
同理,BaseFragment 也要这样操作,大同小异。这里以 v4 包的 Fragment 举例:
1 | abstract class BaseFragment:Fragment() { |
与 Activity 不同,这里在 onAttach 中注册。
2.创建 MainActivitySub
1 | ]) |
这里多说几句,StudentModule 是 Student 类对应的 Module,Student 类需要注入 MainActivity,MainActivity 继承自 BaseActivity。这几个类简单就不贴了,详情见 源码。
如果项目中有 Fragment,那么它对应的 Sub 接口这样写:
1 | ]) |
上面这两个接口都使用了 Builder 模式。
3.创建 ActivityModule
1 | ]) |
所有 Activity 都要在 ActivityModule 中添加:
1
每个 Activity 都要建立对应的 XXXActivitySub 接口(上面第 2 步),而且这些 XXXActivitySub 接口都要添加到 ActivityModule 的
subcomponents
中:1
class)]) ,(YYYActivitySub::
FragmentModule 也是一样的套路:
1 | ]) |
4.创建 ApplicationSub
1 | class)]) , (FragmentModule:: |
ApplicationSub 管理 ActivityModule 和 FragmentModule,而这两个类管理所有的 Activity 和 Fragment,这样,就只需要在 Application 中初始化就好了。
5.初始化
1 | class MyApp : Application(), HasActivityInjector, HasSupportFragmentInjector { |
6.其他说明
我使用的开发环境是
gradle:3.1.2 + kotlin_version = '1.2.30'
,需要在 app.gradle 里面添加apply plugin: 'kotlin-kapt'
使用针对 Android 的 dagger 地址:
1
2
3kapt 'com.google.dagger:dagger-compiler:2.12'
implementation 'com.google.dagger:dagger-android:2.12'
implementation 'com.google.dagger:dagger-android-support:2.12'Rebuild 的时候会提示如下红色日志,这个不影响,可以直接运行项目:
1
2
3
4
5Folder 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