乐趣区

关于android:daggerandroid多模块项目实现二

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

代码地址

退出移动版