我寫了一篇關於這方面的文章,其中有很多細節:Dagger2 for Modular Architecture,但下面簡短的回答。
你必須以不同的方式使用Dagger2。您無需爲每個功能模塊使用模塊或子組件,而需要使用具有對基本AppComponent的依賴關係的組件。
在一個模塊中,我們通常是這樣做:
@Singleton
@Component(modules = arrayOf(NetworkModule::class, RepositoryModule::class,
SubcomponentModule::class))
interface ApplicationComponent : AndroidInjector<MyApplication> {
val userRepository: UserRepository
val apiService: ApiService
}
@Module
object NetworkModule {
@Provides
@Singleton
@JvmStatic
fun provideApiService(okHttp: OkHttp): ApiService {
return ApiSerive(okHttp)
}
}
但正如你說你沒有訪問SubComponentModule這可能是在其他功能模塊的另一個模塊或引用匕首模塊。
您只需創建一個功能模塊中根據ApplicationComponent這樣一個新的匕首模塊:
@Browser
@Component(modules = [(BrowserModule::class)],
dependencies = [(AppComponent::class)])
interface BrowserComponent : AndroidInjector<AppCompatActivity> {
@Component.Builder
abstract class Builder: AndroidInjector.Builder<AppCompatActivity>(){
/**
* explicity declare to Dagger2
* that this builder will accept an AppComponent instance
**/
abstract fun plus(component: AppComponent): Builder
}
}
以及相應的功能活動將構建組件:
class BrowserActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
DaggerBrowserComponent
.builder()
/**
* we have to provide an instance of the AppComponent or
* any other dependency for this component
**/
.plus((application as MyApplication).component)
.build()
.inject(this)
}
}
從這[InstantApps兼容圖書館](https://developer.android.com/topic/instant-apps/prepare.html#identify_tested_compatible_libraries)鏈接,也許匕首不僅僅支持... –
該鏈接僅適用於Google圖書館,不適用於第三方-派對。 – TWL
你可以檢查這個網址https://github.com/ragdroid/instant-app-dagger它可以幫助你。 –