Кинжал 2 Внедрение двух экземпляров одного и того же объекта в два разных фрагмента - PullRequest
0 голосов
/ 05 ноября 2018

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

@Module
public class FragmentAModule {

    @Provides
    BaseFragment providesBaseFragment(FragmentA fragment) {
        return fragment;
    }

    @Provides
    CustomView[] providesArray(CustomView1 view1, CustomView2 view2, CustomView3 view3) {
        return new CustomView[]{view1, view2, view3};
    }

    @Provides
    PagerAdapter providePagerAdapter(CustomView[] array) {
        return new CustomPagerAdapter(array);
    }
}

@Module
public class FragmentBModule {

    @Provides
    BaseFragment providesBaseFragment(FragmentB fragment) {
        return fragment;
    }

    @Provides
    CustomView[] providesArray(CustomView4 view4, CustomView5 view5, CustomView6 view6) {
        return new CustomView[]{view4, view5, view6};
    }

    @Provides
    PagerAdapter providePagerAdapter(CustomView[] array) {
        return new CustomPagerAdapter(array);
    }
}

BaseFragment - это фрагмент, расширяющий DaggerFragment. CustomView - это не android.View, это контроллер для каждой страницы в PagerAdapter

Ошибка кинжала:

error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] android.support.v4.view.PagerAdapter cannot be provided without an @Provides-annotated method.
A binding with matching key exists in component: org.FragmentModule_ContributeFragmentB.FragmentBSubcomponent
A binding with matching key exists in component: org.MainActivityModule_ContributeFragmentA.FragmentASubcomponent
A binding with matching key exists in component: org.MainActivityModule_ContributeFragmentB.FragmentBSubcomponent
android.support.v4.view.PagerAdapter is injected at
org.FragmentA.adapter
org.FragmentA is injected at
dagger.android.AndroidInjector.inject(T)

Ответы [ 2 ]

0 голосов
/ 13 мая 2019
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;

import javax.inject.Scope;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Scope
@Documented
@Retention(RUNTIME)
public @interface FragmentScope {
}

@Module
public class FragmentAModule {

    @Provides
    @FragmentScope
    BaseFragment providesBaseFragment(FragmentA fragment) {
        return fragment;
    }

    @Provides
    @FragmentScope
    CustomView[] providesArray(CustomView1 view1, CustomView2 view2, CustomView3 view3) {
        return new CustomView[]{view1, view2, view3};
    }

    @Provides
    @FragmentScope
    PagerAdapter providePagerAdapter(CustomView[] array) {
        return new CustomPagerAdapter(array);
    }
}

@Module
public class FragmentBModule {

    @Provides
    @FragmentScope
    BaseFragment providesBaseFragment(FragmentB fragment) {
        return fragment;
    }

    @Provides
    @FragmentScope
    CustomView[] providesArray(CustomView4 view4, CustomView5 view5, CustomView6 view6) {
        return new CustomView[]{view4, view5, view6};
    }

    @Provides
    @FragmentScope
    PagerAdapter providePagerAdapter(CustomView[] array) {
        return new CustomPagerAdapter(array);
    }
}

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

0 голосов
/ 07 ноября 2018

смотрите, вы можете использовать мульти-привязки, которые вы можете узнать немного больше из официальной документации Официальная документация .

дополнительно вы можете попробовать следующее:

@Module
public class FragmentAModule {

    @Provides
    BaseFragment providesBaseFragment(FragmentA fragment) {
        return fragment;
    }

    @Provides
    @Named("array1")
    CustomView[] providesArray1(CustomView1 view1, CustomView2 view2, CustomView3 view3) {
        return new CustomView[]{view1, view2, view3};
    }

    @Provides
    @Named("array2")
    CustomView[] providesArray2(CustomView4 view4, CustomView5 view5, CustomView6 view6) {
    return new CustomView[]{view4, view5, view6};
}

    @Provides
    @Named("pagerAdapter1")
    PagerAdapter providePagerAdapter1(@Named("array1") CustomView[] array) {
        return new CustomPagerAdapter(array);
    }

    @Provides
    @Named("pagerAdapter2")
    PagerAdapter providePagerAdapter2(@Named("array2") CustomView[] array) {
        return new CustomPagerAdapter(array);
    }
}

и когда вы вставляете фрагмент в упражнении, вы делаете это следующим образом:

@Inject @Named("array1") CustomView[] array1;
@Inject @Named("array2") CustomView[] array2;

@Inject @Named("pagerAdapter1") PagerAdapter pagerAdapter1;
@Inject @Named("pagerAdapter2") PagerAdapter pagerAdapter2;

Надеюсь, это поможет вам, если вы не оставите комментарий, а я постараюсь помочь вам решить его.

...