Skip to content

qq549631030/MultiModuleDagger4

Repository files navigation

组件化项目

我们在Dagger2多模块项目依赖方式选择二的基础上改造实现

具体实现和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插件来实现

先中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启动的时候每个模块的初始化都会自动执行了

About

dagger.android组件化项目实现

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages