我在viewpager中有一个类DashboardActivity
,其中有两个片段A和B。每个片段分别具有自己的ViewModel
,AViewModel
和BViewModel
。
现在,我正在为Subcomponent
创建一个DashboardActivity
,它将两个视图模型实例绑定在一起,并通过ContributesAndroidFragment
将它们注入片段中。
如何为每个片段创建一个子组件,以便仍然可以满足需要活动的依赖关系(在这种情况下为NavigationController
)?即如何通过提供片段要附加到的活动来创建此子组件?
请考虑将这些片段添加到应用程序的其他位置,以便附加活动在运行时可能有所不同。
这是我的操作方式:
AppComponent:
@Singleton
@Component(
modules = [
ApplicationModule::class,
AndroidSupportInjectionModule::class,
NetModule::class,
...
ActivityBindings::class
]
)
interface ApplicationComponent : AndroidInjector<MyApp> {
@Component.Factory
interface Factory {
fun create(@BindsInstance application: Application): ApplicationComponent
}
}
ActivityBindings:
@Module
abstract class ActivityBindings {
@ContributesAndroidInjector(modules = [DashboardModule::class])
@PerActivity
abstract fun dashboardModule(): DashboardActivity
...
}
DashboardModule:
@Module(includes = [CommonActivityModule::class])
abstract class DashboardModule {
@Binds
abstract fun bindsActivity(activity: DashboardActivity): AppCompatActivity
@ContributesAndroidInjector
abstract fun contributeFragmentA(): FragmentA
@ContributesAndroidInjector
abstract fun contributesFragmentB(): FragmentB
@Binds
@IntoMap
@ViewModelKey(BViewModel::class)
@PerActivity
internal abstract fun bViewModel(bViewModel: BViewModel): ViewModel
@Binds
@IntoMap
@ViewModelKey(AViewModel::class)
@PerActivity
internal abstract fun aViewModel(aViewModel: AViewModel): ViewModel
}
CommonActivityModule:
@Module(includes = [ViewContainerModule::class, ViewModelBuilder::class])
abstract class CommonActivityModule {
@Binds
@ForActivity
abstract fun bindsContext(activity: AppCompatActivity): Context
@Module
companion object {
@Provides
@PerActivity
@JvmStatic
fun provideNavigationController(activity: AppCompatActivity) = NavigationController(activity)
}
}
PS。我需要能够从fragmentA
和fragmentB
注入更多片段,因此它们也应充当AndroidInjectors