Dagger 2 + MVP - один ведущий, назначенный нескольким фрагментам - PullRequest
0 голосов
/ 29 августа 2018

Я хотел бы реализовать часть приложения, которая выполняет некоторые шаги, которые будут обрабатываться одним докладчиком. Я объявил одну область:

@Scope
annotation class FormScope

далее я хотел объявить модуль, который обеспечивал бы необходимые зависимости:

    @Module
object FormModule {

    @JvmStatic
    @Provides
    fun providesFragmentManager(activity: FragmentActivity): FragmentManager = activity.supportFragmentManager

    @JvmStatic
    @Provides
    fun providesNavigation(fragmentManager: FragmentManager): SobergridCoachingNavigationUnauthorizedFirstStep = SobergridCoachingNavigationUnauthorizedFirstStep(fragmentManager)

    @JvmStatic
    @Provides
    fun providesCoordinator(navigation: NavigationUnauthorized): CoordinatoUnauthorized = CoordinatoUnauthorized(navigation)

    @JvmStatic
    @Provides
    @Reusable
    fun providesPresenter(coordinator: CoordinatoUnauthorized): OnboardingFragmentContract.Presenter = FormPresenter(coordinator)

}

и, наконец, я связываю модули в фрагменты, в которые я хочу вставить зависимости:

@Module(includes = [AndroidSupportInjectionModule::class])
abstract class FragmentBindingModule {

    @FormScope
    @ContributesAndroidInjector(modules = [FormFirstModule::class, FormModule::class])
    abstract fun contributesFormFirst(): FormFirstFragment
    @ContributesAndroidInjector(modules = [FormSecondModule::class, FormModule::class])
    abstract fun contributesFormSecond(): FormSecondFragment
    @ContributesAndroidInjector(modules = [FormThirdModule::class, FormModule::class])
    abstract fun contributesFormThird(): FormThirdFragment
}

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда показывается новый фрагмент, Кинжал создает новый экземпляр Presenter. Я хочу использовать одного докладчика для всех этих фрагментов. Что я делаю не так? Что я должен улучшить, чтобы достичь своей цели?

UPDATE

Я также пытался аннотировать мой метод предоставления с помощью @Singleton

    @JvmStatic
    @Provides
    @Signleton
    fun providesPresenter(coordinator: CoordinatoUnauthorized): OnboardingFragmentContract.Presenter = FormPresenter(coordinator)

но это приводит к ошибке компиляции. Последнее, что я пытался сделать, - это поместить аннотации (@Reusable и @Singleton) перед объявлением класса Presenter. Этот подход не дает мне ошибок компиляции, но все же существует несколько экземпляров класса Presenter.

1 Ответ

0 голосов
/ 30 августа 2018

Переместите вашего докладчика в модуль FragmentActivity с областью действия, чтобы получить одного и того же докладчика для всех фрагментов в действии

@Module
public class FragmentActivityModule {

    //common provides for all fragments
    @Provides
    @FormScope
    public YourPresenter providesYourPresenter() {
        return new YourPresenter();
    }

    ....

И ваш строитель должен выглядеть так

@Module
public abstract class ActivityBuilder {

@FormScope
@ContributesAndroidInjector(modules = {FragmentActivityModule.class, Form1FragmentProvider.class
        , Form2FragmentProvider.class})
abstract FragmentActivity bindFragmentActivity();

В Form1FragmentModule предусмотрены только для Form1Fragment. Создать FragmentProviders для всех фрагментов Form1FragmentProvider, Form2FragmentProvider ...

@Module
public abstract class Form1FragmentProvider {

    @ContributesAndroidInjector(modules = Form1FragmentModule.class)

    abstract Form1Fragment provideForm1FragmentFactory();
}

Не забудьте внедрить HasSupportFragmentInjector в вашу FragmentActivity

public class  FragmentActivity extends AppCompatActivity implements HasSupportFragmentInjector {

    @Inject
    DispatchingAndroidInjector<Fragment> fragmentDispatchingAndroidInjector;

....

@Override
    public AndroidInjector<Fragment> supportFragmentInjector() {
        return fragmentDispatchingAndroidInjector;
    }

Не забудьте прикрепить AndroidSupportInjection в свои фрагменты

@Override
    public void onAttach(Context context) {
        AndroidSupportInjection.inject(this);
        super.onAttach(context);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...