I was trying to do SubScoping in Dagger2. However, I am not able to figure out this compilation error:-> ...MyApplicationModule must be set
which happens in my LogInFragment
. If someone will try to throw some light on this error. I would really be glad.
This is MyApplication Class:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
MyInjector.initialize(this);
}
}
This is MyInjector Class:
public enum MyInjector {
INSTANCE;
MyApplicationComponent myApplicationComponent;
private MyInjector() {
}
public static void initialize(MyApplication myApplication) {
MyApplicationComponent myApplicationComponent = DaggerMyApplicationComponent.builder()
.myApplicationModule(new MyApplicationModule(myApplication))
.build();
INSTANCE.myApplicationComponent = myApplicationComponent;
}
public static MyApplicationComponent get() {
return INSTANCE.myApplicationComponent;
}
}
This is MyApplicationComponent Class:
@Component (modules = {MyApplicationModule.class})
public interface MyApplicationComponent {
}
This is MyApplicationModule Class
@Module
public class MyApplicationModule {
private final MyApplication myApplication;
public MyApplicationModule(MyApplication myApplication) {
this.myApplication = myApplication;
}
@Singleton
@Provides
SharedPreferences providesSharedPreferences(Context context) {
return context.getSharedPreferences("My_Pref", Context.MODE_PRIVATE);
}
@Singleton
@Provides
public Context providesMyApplicationContext() {
return this.myApplication.getApplicationContext();
}
@Singleton
@Provides
public LocationManager providesLocationService(Context context) {
return (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
}
@Singleton
@Provides
public MyDatabaseManager providesMyDatabaseManager(Context context) {
return MyDatabaseManager.getInstance(context);
}
@Singleton
@Provides
public AccountSystemModel providesAccountSystemModel(Context context) {
return MyDatabaseManager.getInstance(context);
}
@Singleton
@Provides
public MyApplication providesMyApplication(){
return this.myApplication;
}
}
This is where I am trying to Subscope
This is MyLogIn Component Class
@Singleton
@Component(modules = {MyApplicationModule.class}, dependencies = {MyApplicationComponent.class})
public interface LogInComponent {
LogInPresenter signInPresenter();
}
This is where the Compilation Error
happens
This is MyLogInActivityFragment
@Override protected void injectDependencies() {
logInComponent = DaggerLogInComponent.builder()
.myApplicationComponent(MyInjector.get())
.build();
}
Your LogInComponent
depends on MyApplicationComponent
which contains MyApplicationModule
. You shouldn't be declaring this same module in the LogInComponent
too. Remove it and it will compile.
Also, make sure you expose dependencies you need in the LogInComponent
from MyApplicationComponent
by adding them to the component interface like so:
@Component (modules = {MyApplicationModule.class})
public interface MyApplicationComponent {
Context context();
SharedPreferences sharedPreferences();
// ...
}
Another tip – if you need all dependencies from the MyApplicationComponent
you might want to read about subcomponents.