本文适合有一定的Dagger2使用基础的同学
上一篇:dagger.android多模块项目实现
下一篇:Hilt多模块项目实现
上一篇我们讲了dagger.android在普通多模块项目中的用法
本篇我们讲下组件化项目怎么使用dagger.android
我们在Dagger2组件化项目Component组织方式选择的基础上改造实现
具体实现和dagger.android多模块项目实现差不多,唯一差异是MultiModuleAndroidInjector放在BaseApplication中
open class BaseApplication : Application(), HasAndroidInjector {
val multiModuleAndroidInjector = MultiModuleAndroidInjector()
lateinit var appComponent: AppComponent
override fun onCreate() {
super.onCreate()
instance = this
appComponent = DaggerAppComponent.factory().create(this)
}
companion object {
lateinit var instance: BaseApplication
}
override fun androidInjector(): AndroidInjector<Any> {
return multiModuleAndroidInjector
}
}
然后AppApplication
class AppApplication : BaseApplication() {
override fun onCreate() {
super.onCreate()
//这部份应当各种模块中初始化(后期用插件实现)
val userDispatchingInjector = BaseDispatchingInjector()
UserComponentHolder.userComponent.inject(userDispatchingInjector)
multiModuleAndroidInjector.addInjector(userDispatchingInjector)
val newsDispatchingInjector = BaseDispatchingInjector()
NewsComponentHolder.newsComponent.inject(newsDispatchingInjector)
multiModuleAndroidInjector.addInjector(newsDispatchingInjector)
}
}
这里user,news模块初始化放在app模块中,与组件化思想不符,这里可以使用AppLike插件来实现,AppLike插件的作用是在任意模块实现APP初动时做一些初始化工作。
先中BaseApplication中加入AppLikeManager的onCreate和onTerminate方法
open class BaseApplication : Application(), HasAndroidInjector {
val multiModuleAndroidInjector = MultiModuleAndroidInjector()
lateinit var appComponent: AppComponent
override fun onCreate() {
super.onCreate()
instance = this
appComponent = DaggerAppComponent.factory().create(this)
AppLikeManager.onCreate(this)
}
override fun onTerminate() {
AppLikeManager.onTerminate(this)
super.onTerminate()
}
companion object {
lateinit var instance: BaseApplication
}
override fun androidInjector(): AndroidInjector<Any> {
return multiModuleAndroidInjector
}
}
然后每个模块建一个AppLike,把初始化代码放在onCreate方法中
@AppLike
class NewsAppLike : IAppLike {
override fun onCreate(context: Context) {
val newsDispatchingInjector = BaseDispatchingInjector()
NewsComponentHolder.newsComponent.inject(newsDispatchingInjector)
(context as? BaseApplication)?.run {
multiModuleAndroidInjector.addInjector(newsDispatchingInjector)
}
}
override fun getPriority(): Int {
return 5
}
override fun onTerminate(context: Context) {
}
}
@AppLike
class UserAppLike : IAppLike {
override fun onCreate(context: Context) {
val userDispatchingInjector = BaseDispatchingInjector()
UserComponentHolder.userComponent.inject(userDispatchingInjector)
(context as? BaseApplication)?.run {
multiModuleAndroidInjector.addInjector(
userDispatchingInjector
)
}
}
override fun getPriority(): Int {
return 5
}
override fun onTerminate(context: Context) {
}
}
这样APP启动的时候每个模块的初始化都会自动执行了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。