本文適合有必定的Dagger2使用基礎的同窗android
上一篇:Dagger2多模塊項目Component組織方式選擇(一)
下一篇:[dagger.android多模塊項目實現(一)]()git
上一篇文章咱們講了普通多模塊項目dagger2 Component用繼承(SubComponent)方式實現,這一篇咱們來講說組件化的項目使用依賴(dependencies)怎麼實現。github
項目模塊結構以下圖 segmentfault
在組件化多模塊項目中,app模塊只在最終打包的時候直接依賴user,news模塊,當user,news做爲單獨APP來運行時與app不存在依賴關係了,因此Appcomponent不能放在app模塊中了這種狀況下應該放在base中。 app
然而若是放在base模塊中,base沒有user,news的依賴,沒法使用註冊UserComponent和NewsComponent因此這時候不能再使用SubComponent方法來實現依賴了ide
這種狀況下只能使用dependencies方式 組件化
base模塊中:ui
@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模塊能夠直接使用 this
user模塊:spa
@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() } }