luojilab / DDComponentForAndroid

一套完整有效的android组件化方案,支持组件的组件完全隔离、单独调试、集成调试、组件交互、UI跳转、动态加载卸载等功能
MIT License
3.34k stars 570 forks source link

关于组件化dagger android使用相关问题 #121

Open canhuah opened 5 years ago

canhuah commented 5 years ago

你好 目前在考虑使用组件化改造项目。所以进来学习一波

由于dagger android的初始化需要写在application当中 假如各个Moudle单独作为App运行的话需要些在各个moudle的的Application当中, 那moudle作为lib的时候,该如何初始化各个lib里 的dagger android呢。 希望能提供一些思路。

liulinjie1990823 commented 5 years ago

我是使用了cc的组件化,DDComponentForAndroid也类似 LoginModule工程中:

class LoginModule : IComponent {
    private lateinit var mLoginComponent: LoginComponent

    override fun getName(): String {
        return "LoginModule"
    }

    override fun onCall(cc: CC?): Boolean {
        if (cc == null) {
            return false
        }
        if ("init" == cc.actionName) {
            val componentApplication = cc.context as ComponentApplication
            mLoginComponent = DaggerLoginComponent.builder()
                    .component(componentApplication.mComponent)
                    .build()
        } else if ("injectActivity" == cc.actionName) {
            val activity = cc.context as Activity
            mLoginComponent.activityInjector().inject(activity)
        } else if ("injectFragment" == cc.actionName) {
            val activity = cc.context as FragmentActivity
            val tag = cc.getParamItem<String>("fragment")

            if (tag != null) {
                val findFragmentByTag = activity.supportFragmentManager.findFragmentByTag(tag)
                if (findFragmentByTag != null) {
                    mLoginComponent.supportFragmentInjector().inject(findFragmentByTag)
                }
            }
        }
        return false
    }
}
@Singleton
@Component(
        dependencies = [
            com.llj.component.service.Component::class //依赖库中的Component,可以获得一些字段
        ],
        modules = [
            AndroidInjectionModule::class,
            AndroidSupportInjectionModule::class,
            LoginComponentBuilder::class, //将所有的Activity,Fragment注册进来
            LoginComponentModule::class
        ])
interface LoginComponent {

    //    @Component.Builder
    //    interface Builder {
    //
    //        //提供给AppModule中方法中的Application入参用
    //        @BindsInstance
    //        fun application(application: Application): Builder
    //
    //        fun build(): LoginComponent
    //    }
    //调用该方法才会注入BaseApplication中的@Inject标记的对象
    //    override fun inject(application: BaseApplication)

    fun activityInjector(): DispatchingAndroidInjector<Activity>
    fun supportFragmentInjector(): DispatchingAndroidInjector<Fragment>
}

app工程:

class AppApplication : ComponentApplication() {
    private lateinit var mAppComponent: AppComponent

    override fun injectApp() {
        mAppComponent = DaggerAppComponent.builder()
                .component(mComponent)
                .build()

        //调用LoginComponent中的dagger组件
        CC.obtainBuilder("LoginModule")
                .setActionName("init")
                .build()
                .call()
}
}
class AppApplication : ComponentApplication() {
...
override fun activityInjector(): AndroidInjector<Activity>? {
        return AndroidInjector { activity ->
            val mvpBaseActivity = activity as MvpBaseActivity<*>

            if ("app" == mvpBaseActivity.moduleName()) {
                //主工程
                mAppComponent.activityInjector().inject(activity)
            } else if ("login" == mvpBaseActivity.moduleName()) {
               //LoginModule
                CC.obtainBuilder("LoginModule")
                        .setContext(activity)
                        .setActionName("injectActivity")
                        .build()
                        .call()
            }
        }
    }

    override fun supportFragmentInjector(): AndroidInjector<Fragment>? {
        return AndroidInjector { fragment ->
            val mvpBaseFragment = fragment as MvpBaseFragment<*>

            if ("app" == mvpBaseFragment.moduleName()) {
                //主工程
                mAppComponent.supportFragmentInjector().inject(fragment)
            } else if ("login" == mvpBaseFragment.moduleName()) {
            //LoginModule
                CC.obtainBuilder("LoginModule")
                        .setContext(fragment.context)
                        .addParam("fragment", fragment.tag)
                        .setActionName("injectFragment")
                        .build()
                        .call()
            }
        }
    }
...
}
xiaojinzi123 commented 5 years ago

你好 目前在考虑使用组件化改造项目。所以进来学习一波

由于dagger android的初始化需要写在application当中 假如各个Moudle单独作为App运行的话需要些在各个moudle的的Application当中, 那moudle作为lib的时候,该如何初始化各个lib里 的dagger android呢。 希望能提供一些思路。

其实没必要单独运行的,原因如下:

另外其实 ddcomponent 组件化我从一年前就开始看,内部还是很多可以优化或者西区其他组件化的优点的,所以我原理采纳自 ddcomponent,自行写了一个更加完善的,你不妨可以看看,就当学些也好,链接如下 Component