Search code examples
androiddagger-2dagger

Dagger2 Error: Module Must Be Set


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();
}

Solution

  • 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.