本文适宜有肯定的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模块中:
<code class="kotlin">@Module class 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模块:
<code class="kotlin">@Module class UserModule { @IntoSet @Provides fun provideString(): String { return "user" } } @UserScope @Component(modules = [UserModule::class], dependencies = [AppComponent::class]) interface UserComponent { fun inject(userActivity: UserActivity) }
news模块
<code class="kotlin">@Module class 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,通过以下办法来创立
<code class="kotlin"> val newsComponent = DaggerNewsComponent.builder() .appComponent(BaseApplication.instance.appComponent) .build() val userComponent = DaggerUserComponent.builder() .appComponent(BaseApplication.instance.appComponent) .build()
<code class="kotlin">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中应用和前一篇一样
<code class="kotlin">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() } }
代码地址