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"