本文适宜有肯定的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()
}
}
代码地址
发表回复