当在动态功能模块中使用Dagger注入时,需要将依赖项注入到具有不同生命周期的组件中。 在这种情况下,您无法直接从全局的AppComponent中注入依赖项。
一种解决方法是创建一个子组件,该子组件仅作用于动态功能模块。 以下是示例代码:
//在动态功能模块中创建 Module 和 Component @Module class MyDynamicModule { // provide dependencies here }
@DynamicScope @Component( dependencies = [AppComponent::class], modules = [MyDynamicModule::class] ) interface MyDynamicComponent { // let the dynamic feature inject into itself fun inject(myDynamicFeature: MyDynamicFeature) }
//在AppComponent中暴露 DynamicComponent interface AppComponent { fun exposeDynamicComponent(): MyDynamicComponent }
//在 Application 中初始化全局的 AppComponent class MyApplication : Application() { private lateinit var appComponent: AppComponent
override fun onCreate() {
super.onCreate()
appComponent = DaggerAppComponent.builder()
// set global dependencies here
.build()
}
fun getAppComponent(): AppComponent {
return appComponent
}
}
//在动态功能模块中使用 class MyDynamicFeature : Fragment() { override fun onAttach(context: Context) { super.onAttach(context) // obtain the dynamic component from the activity, then inject into self (requireActivity() as HasAppComponent) .getAppComponent() .exposeDynamicComponent() .inject(this) } }
// 状态变量保存当前动态功能模块是否加载,建议在Activity中最先声明和初始化。
private val hasDynamicFeature = mutableMapOf
// 在 Activity 中判断并加载动态功能模块(如果已经加载过则跳过),并提供对应的子组件实例,用以注入依赖。 class MainActivity : AppCompatActivity(), HasAppComponent { private lateinit var dynamicComponent: MyDynamicComponent
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate