kotlin中配置Dagger2
- 在app模块的build.gradle文件中进行如下配置,
//dagger
api "com.google.dagger:dagger:$dagger_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
api "com.google.dagger:dagger-android:$dagger_version"
api "com.google.dagger:dagger-android-support:$dagger_version"
annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
复制代码
- 相关常用注解:
@Inject
@Component
@Module
@Provides
@Qualifier和@Named
@Scope和@Singleton
复制代码
@Inject
@Inject注解只是JSR-330中定义的注解,在javax.inject包中。 这个注解本身并没有作用,它需要依赖于注入框架才具有意义,可以用来标记构造函数、属性和方法。
标记构造函数 被标记的构造函数可以有0个或多个依赖作为参数。 同一个类中最多只可以标记一个构造函数。
class People @Inject constructor(val name:String = "Tom")
复制代码
注意在kotlin中这种写法是不被允许的,因为这等价于java中的多个构造方法People(String name), People(),正确的写法应该是这样:
data class People constructor(val name: String) {
@Inject
constructor() : this("Tom")
}
复制代码
标记属性
被标记的属性不能是final的,kotlin中不能是val。 被注入进的属性不能用private修饰(是Dagger2不支持,而非@Inject不支持)
@Inject
lateinit var people:People
复制代码
标记方法
被标记的方法可以有0个或多个依赖作为参数。 方法不能是抽象的。
class HomeActivity : AppCompatActivity() {
private lateinit var people:People
@Inject
fun setPeople(people:People){
this.people = people
}
}
复制代码
这种方法注入和属性注入并没有什么本质上的不同,实现效果也基本一样。还有一种做法是@Inject标记被注入类的某个方法,该方法会在类的构造方法之后接着被调用:
data class People constructor(val name: String) {
@Inject
constructor() : this("Tom")
init {
println("init:$name")
}
@Inject
fun hello(){
println("hello:$name")
}
}
class HomeActivity : AppCompatActivity() {
@Inject
lateinit var people:People
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home)
//执行相关注入操作
...
println(people.toString())
}
}
复制代码
运行结果是这样的:
01-02 11:57:30.995 16601-16601/? I/System.out: init:Tom
01-02 11:57:30.995 16601-16601/? I/System.out: hello:Tom
01-02 11:57:30.995 16601-16601/? I/System.out: People(name=Tom)
复制代码
项目相关代码
application
class SkyApplication:DaggerApplication(){
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerApplicationComponent.builder().create(this)
}
override fun onCreate() {
super.onCreate()
CoreAppExt.onCreate(this, true)
}
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
CoreAppExt.attachBaseContext(base)
}
}
复制代码
xxxDaggerActivity
由于只能单继承,使用dagger时继承CoreDaggerActivity,CoreDaggerFragment,代码和 DaggerActivity、CoreDaggerFragment 相同;
不使用时,可以直接继承CoreActivity,CoreFragment;
abstract class CoreDaggerActivity : CoreActivity(), HasFragmentInjector, HasSupportFragmentInjector {
@Inject
lateinit var supportFragmentInjector: DispatchingAndroidInjector<Fragment>
@Inject
lateinit var frameworkFragmentInjector: DispatchingAndroidInjector<android.app.Fragment>
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
}
override fun supportFragmentInjector(): AndroidInjector<Fragment>? {
return supportFragmentInjector
}
override fun fragmentInjector(): AndroidInjector<android.app.Fragment>? {
return frameworkFragmentInjector
}
}
复制代码
abstract class CoreDaggerFragment<T : ViewDataBinding> : CoreFragment<T>(), HasSupportFragmentInjector {
@Inject
lateinit var childFragmentInjector: DispatchingAndroidInjector<Fragment>
override fun onAttach(context: Context?) {
AndroidSupportInjection.inject(this)
super.onAttach(context)
}
override fun supportFragmentInjector(): AndroidInjector<Fragment>? {
return childFragmentInjector
}
}
复制代码
ApplicationComponent
@Singleton
@Component(
modules = [
AndroidSupportInjectionModule::class,
ActivityModule::class,
SupportFragmentModule::class,
MainDaggerModule::class,
HomeDaggerModule::class]
)
interface ApplicationComponent : AndroidInjector<SkyApplication> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<SkyApplication>()
}
复制代码
ActivityModule、SupportFragmentModule
@Module
abstract class ActivityModule {
@ContributesAndroidInjector
abstract fun contributeMainActivity(): MainActivity
}
/**
* SupportFragment Dagger2 Module
*/
@Module
abstract class SupportFragmentModule {
@ContributesAndroidInjector
abstract fun contributeCatalogFragment(): HomeFragment
@ContributesAndroidInjector
abstract fun contributeDiscoverFragment(): DiscoverFragment
@ContributesAndroidInjector
abstract fun contributeSettingFragment(): SettingFragment
}
复制代码
MainActivity
class MainActivity : CoreDaggerActivity(), BottomNavigationView.OnNavigationItemSelectedListener {
@Inject
lateinit var mMainViewModel: MainViewModel
var mDataBingding: ActivityMainBinding? = null
private var mAdapter: CoreFragmentPagerAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mDataBingding = bindingContentView(R.layout.activity_main)
setUpNavigation()
setUpViewPager()
NSkyLog.d(TAG, "MainViewModel ${mMainViewModel.doSomething()}")
}
复制代码
结果信息
2019-02-18 18:32:27.279 20743-20768/? I/com.nsky.app_LOGGER: ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: │ Thread: pool-1-thread-1
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: │ NSkyLog.i (NSkyLog.java:82)
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: │ NSkyLog$DefaultLogDelegate.i (NSkyLog.java:48)
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: │ CoreAppExt:onCreate
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: └────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2019-02-18 18:32:27.451 20743-20743/? D/com.nsky.app_LOGGER: ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: │ Thread: main
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: │ NSkyLog.d (NSkyLog.java:88)
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: │ NSkyLog$DefaultLogDelegate.d (NSkyLog.java:53)
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: │ MainActivity:MainViewModel This is MainViewModel
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: └────────────────────────────────────────────────────────────────────────────────────────────────────────────────
复制代码
项目地址: NSkyKit