匕首2.11 – 如何让Activity和Fragment共享共同的价值观?
我目前正在学Android的Dagger 2,我想将Activity的注入注入到Fragment中,但我不知道如何。
这是一个工作设置,显示被注入片段和活动的值。
对不起,代码墙,我简化了我的代码,使其只包含相关的部分。
@Singleton @Component(modules = arrayOf(AndroidSupportInjectionModule::class, AppModule::class, BuildersModule::class)) interface AppComponent { @Component.Builder interface Builder { @BindsInstance fun setApplication(application: Application): Builder fun build(): AppComponent } fun apiService() : ApiService fun inject(app: App) } @Module(subcomponents = arrayOf(MainActivitySubComponent::class, MainFragmentSubComponent::class)) class AppModule @Module abstract class BuildersModule { @Binds @IntoMap @ActivityKey(MainActivity::class) abstract fun bindMainActivity(builder: MainActivitySubComponent.Builder): AndroidInjector.Factory<out Activity> @Binds @IntoMap @dagger.android.support.FragmentKey(MainFragment::class) abstract fun bindMainFragment(builder: MainFragmentSubComponent.Builder): AndroidInjector.Factory<out Fragment> }
AppComponent
是在应用程序中创建的:
class App : Application(), HasActivityInjector { @Inject var activityInjector: DispatchingAndroidInjector<Activity>? = null override fun onCreate() { super.onCreate() DaggerAppComponent .builder() .setApplication(this) .build() .inject(this) } override fun activityInjector(): AndroidInjector<Activity>? { return activityInjector } }
主要活动:
@Subcomponent(modules = arrayOf(MainActivityModule::class)) interface MainActivitySubComponent : AndroidInjector<MainActivity> { @Subcomponent.Builder abstract class Builder : AndroidInjector.Builder<MainActivity>() } @Module class MainActivityModule { @Provides fun providePresenter(mainView: MainView, apiService: ApiService): MainPresenter = MainPresenterImpl(mainView, apiService) } class MainActivity : AppCompatActivity(), HasSupportFragmentInjector { @Inject lateinit var mainPresenter: MainPresenter @Inject lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment> override fun onCreate(savedInstanceState: Bundle?) { AndroidInjection.inject(this) super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (savedInstanceState == null) { supportFragmentManager .beginTransaction() .add(R.id.container, MainFragment()) .commitAllowingStateLoss() } } override fun supportFragmentInjector() = fragmentInjector }
MainFragment:
@Subcomponent(modules = arrayOf(MainFragmentModule::class)) interface MainFragmentSubComponent : AndroidInjector<MainFragment> { @Subcomponent.Builder abstract class Builder : AndroidInjector.Builder<MainFragment>() } @Module class MainFragmentModule { @Provides fun providePresenter(mainView: MainView, apiService: ApiService): MainPresenter = MainPresenterImpl(mainView, apiService) } class MainFragment : Fragment() { @Inject lateinit var mainPresenter: MainPresenter override fun onAttach(context: Context?) { AndroidSupportInjection.inject(this) super.onAttach(context) } }
所以我发现了activity和fragment如何使用相同的ApiService
类。 我想在MainActivity
和MainFragment
注入MainPresenter
的同一个实例。
我怎样才能访问活动的注入MainPresenter
而不改变MainPresenter
的代码? 基本上,我不希望MainFragment
知道如何注入。