Skip to content Skip to sidebar Skip to footer

Dagger 2 On Android: Inject Same Dependency In Activity And Retained Fragment

I have objects of classes F1 and F2 that I want to inject in a retained Fragment. I also have an object of class A that depends on Activity, and I want it to be injected in that Ac

Solution 1:

Considering your retained fragment lives longer than your activity, I'd wager that the proper way to do this would be to make the FragmentScope contain the ActivityScope, and not vice versa.

Meaning your FragmentComponent would have

@FragmentScope@Component(modules = {FragmentModule.class})
public interface FragmentComponent {
    voidinject(MyFragment presenter);
}

And your Activity component would have

@ActivityScope@Component(dependencies = {FragmentComponent.class}, modules = {MainActivityModule.class})
public interface MainActivityComponent extends FragmentComponent { //provision methodsvoidinject(MainActivity activity);

    // make the A object available to dependent componentsAgetA();
}

Which is possible if your Fragment injected classes don't rely on the Activity module as dependencies.

This can be done with something akin to

publicclassMainActivityextendsAppCompatActivity {

    privateMainActivityComponent mainActivityComponent;

    privateMyFragment myFragment;

    @OverridepublicvoidonCreate(Bundle saveInstanceState) {
         super.onCreate(saveInstanceState);
         setContentView(R.layout.activity_main);

         if(saveInstanceState == null) { // first run
             myFragment = newMyFragment(); //headless retained fragmentgetSupportFragmentManager()
                .beginTransaction()
                .add(myFragment, MyFragment.class.getName()) //TAG
                .commit();
         } else {
             myFragment = (MyFragment)(getSupportFragmentManager()
                               .findFragmentByTag(MyFragment.class.getName()));
         }
    }

    @OverridepublicvoidonPostCreate() {
         mainActivityComponent = DaggerMainActivityComponent.builder()
              .fragmentComponent(myFragment.getComponent())
              .build();
    }
}

And

publicclassMyFragmentextendsFragment {
    publicMyFragment() {
         this.setRetainInstance(true);
    }

    private FragmentComponent fragmentComponent;

    @OverridepublicvoidonCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        this.fragmentComponent = DaggerFragmentComponent.create();
    }

    public FragmentComponent getFragmentComponent() {
        return fragmentComponent;
    }
}

EDIT:

publicclassMyFragmentextendsFragment {
    publicMyFragment() {
         this.setRetainInstance(true);
         this.fragmentComponent = DaggerFragmentComponent.create();
    }

    private FragmentComponent fragmentComponent;

    public FragmentComponent getFragmentComponent() {
        return fragmentComponent;
    }
}

publicclassMainActivityextendsAppCompatActivity {

    private MainActivityComponent mainActivityComponent;

    private MyFragment myFragment;

    @Inject
    A mA;

    @Override
    publicvoidonCreate(Bundle saveInstanceState) {
         super.onCreate(saveInstanceState);
         setContentView(R.layout.activity_main);

         if(saveInstanceState == null) { // first run
             myFragment = new MyFragment(); //headless retained fragment
             getSupportFragmentManager()
                .beginTransaction()
                .add(myFragment, MyFragment.class.getName()) //TAG
                .commit();
         } else {
             myFragment = (MyFragment)(getSupportFragmentManager().findFragmentByTag(MyFragment.class.getName()));
         }
         mainActivityComponent = DaggerMainActivityComponent.builder()
              .fragmentComponent(myFragment.getComponent())
              .build();
         mainActivityComponent.inject(this);
         mA.onCreate();
    }
}

Post a Comment for "Dagger 2 On Android: Inject Same Dependency In Activity And Retained Fragment"