Intereting Posts
Получение пустого списка из области, когда я запускаю приложение Android в первый раз. В чем разница между «const» и «val»? Множественное разрешение сразу не работает в android Проблема с инъекцией Kotlin + Dagger в зависимости от Android версии Android / SDK (?) Kotlin + JUnit + postgres для тестирования интеграции: утечка соединений Java Interop: применить @JvmName к getters свойств в интерфейсе или абстрактном классе У Kotlin 1.2.10 и Java 9 есть противоположные правила относительно автоматических модулей? Как сделать символ Null в Kotlin Kotlin: Сохранить изображение в базе данных Как вводить IoC в функции верхнего уровня Kotlin? Я даже использую контейнеры IoC? Конструктор класса данных с двумя разными конструкторами в Котлине Guice MapBinder Как изменить стандартную оболочку Gradle и файл сборки в IntelliJ? Является ли Котлин «передачей по значению» или «передачей по ссылке»? Как отобразить Список << MyClass> в список <T>?

Кинжал 2.11 – как заставить Activity и Fragment разделять общие ценности?

В настоящее время я изучаю Dagger 2 на Android, и я хотел бы ввести инъекцию 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) } } 

Поэтому я узнал, как активность и фрагмент могут использовать один и тот же класс ApiService . Я бы хотел ввести тот же экземпляр MainPresenter как в MainActivity и в MainFragment .

Как я могу получить доступ к MainPresenter без изменения кода в MainFragment ? В принципе, я не хочу, чтобы MainFragment знал что-то о том, как он вводится.