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"