上一篇: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启动的时候每个模块的初始化都会主动执行了

代码地址