Android Dagger 2+MVP-分配给多个片段的单个演示者

Android Dagger 2+MVP-分配给多个片段的单个演示者,android,kotlin,dagger-2,dagger,android-mvp,Android,Kotlin,Dagger 2,Dagger,Android Mvp,我想实现一个应用程序的一部分,它采取一些步骤,这些步骤将由一个演示者处理。我宣布了一个范围: @Scope annotation class FormScope 接下来,我想声明一个模块,该模块将提供必要的依赖关系: @Module object FormModule { @JvmStatic @Provides fun providesFragmentManager(activity: FragmentActivity): FragmentManager =

我想实现一个应用程序的一部分,它采取一些步骤,这些步骤将由一个演示者处理。我宣布了一个范围:

@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
}
我遇到的问题是,每次显示新片段时,匕首都会创建一个演示者的新实例。我想对所有这些片段使用一个演示者。我做错了什么?我应该改进什么才能实现我的目标

更新

我还尝试用@Singleton注释我的provide方法


但这会导致编译错误。我尝试的最后一件事是在Presenter类的声明之前放置@Reusables和@Singleton注释。这种方法不会给我任何编译错误,但仍然存在多个Presenter类实例。

将Presenter提供的内容移动到FragmentActivity模块,并在该模块中为Activity中的所有片段获取相同的Presenter

@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提供。 为所有碎片创建碎片提供程序Form1FragmentProvider、Form2FragmentProvider

@Module
public abstract class Form1FragmentProvider {

    @ContributesAndroidInjector(modules = Form1FragmentModule.class)

    abstract Form1Fragment provideForm1FragmentFactory();
}
不要忘记在碎片活动中实施HasSupportFragmentInjector

public class  FragmentActivity extends AppCompatActivity implements HasSupportFragmentInjector {

    @Inject
    DispatchingAndroidInjector<Fragment> fragmentDispatchingAndroidInjector;

....

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

所有碎片都在同一活动中?@eurosecom是所有碎片都在同一活动中
public class  FragmentActivity extends AppCompatActivity implements HasSupportFragmentInjector {

    @Inject
    DispatchingAndroidInjector<Fragment> fragmentDispatchingAndroidInjector;

....

@Override
    public AndroidInjector<Fragment> supportFragmentInjector() {
        return fragmentDispatchingAndroidInjector;
    }
@Override
    public void onAttach(Context context) {
        AndroidSupportInjection.inject(this);
        super.onAttach(context);
    }