上一篇: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办法中
@AppLikeclass 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) { }}@AppLikeclass 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启动的时候每个模块的初始化都会主动执行了
代码地址