本文适合有一定的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模块中:
@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模块:
@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模块
@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,通过以下方法来创建
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()
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。