本文适宜有肯定的Dagger2应用根底的同学

上一篇:Dagger2多模块我的项目Component组织形式抉择(一)
下一篇:[dagger.android多模块我的项目实现(一)]()

上一篇文章咱们讲了一般多模块我的项目dagger2 Component用继承(SubComponent)形式实现,这一篇咱们来说说组件化的我的项目应用依赖(dependencies)怎么实现。

我的项目模块构造如下图

在组件化多模块我的项目中,app模块只在最终打包的时候间接依赖user,news模块,当user,news作为独自APP来运行时与app不存在依赖关系了,所以Appcomponent不能放在app模块中了这种状况下应该放在base中。

然而如果放在base模块中,base没有user,news的依赖,无奈应用注册UserComponent和NewsComponent所以这时候不能再应用SubComponent办法来实现依赖了

这种状况下只能应用dependencies形式

base模块中:

@Moduleclass AppModule {    @IntoSet    @Provides    fun provideString(): String {        return "app"    }}@Singleton@Component(modules = [AppModule::class])interface AppComponent {    @Component.Factory    interface Factory {        fun create(@BindsInstance context: Context): AppComponent    }}class BaseApplication : Application() {    lateinit var appComponent: AppComponent    override fun onCreate() {        super.onCreate()        instance = this        appComponent = DaggerAppComponent.factory().create(this)    }    companion object {        lateinit var instance: BaseApplication    }}

这里AppComponent放在BaseApplication中,这样user,news模块能够间接应用

user模块:

@Moduleclass UserModule {    @IntoSet    @Provides    fun provideString(): String {        return "user"    }}@UserScope@Component(modules = [UserModule::class], dependencies = [AppComponent::class])interface UserComponent {    fun inject(userActivity: UserActivity)}

news模块

@Moduleclass NewsModule {    @IntoSet    @Provides    fun provideString(): String {        return "news"    }}@NewsScope@Component(modules = [NewsModule::class], dependencies = [AppComponent::class])interface NewsComponent {    fun inject(newsActivity: NewsActivity)}

要生成NewsComponent和UserComponent必须先失去AppComponent,通过以下办法来创立

 val newsComponent = DaggerNewsComponent.builder()            .appComponent(BaseApplication.instance.appComponent)            .build() val userComponent = DaggerUserComponent.builder()            .appComponent(BaseApplication.instance.appComponent)            .build()
object NewsComponentHolder {    val newsComponent: NewsComponent by lazy {        DaggerNewsComponent.builder()            .appComponent(BaseApplication.instance.appComponent)            .build()    }}object UserComponentHolder {    val userComponent: UserComponent by lazy {        DaggerUserComponent.builder()            .appComponent(BaseApplication.instance.appComponent)            .build()    }}

最初在Activity中应用和前一篇一样

class NewsActivity : AppCompatActivity() {    @Inject    lateinit var set: Set<String>    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_news)        NewsComponentHolder.newsComponent.inject(this)        text.text = set.toString()    }}class UserActivity : AppCompatActivity() {    @Inject    lateinit var set: Set<String>    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_user)        UserComponentHolder.userComponent.inject(this)        text.text = set.toString()    }}

代码地址