user8940426
user8940426

Reputation:

Dagger Module must be set

I was trying to add Dagger2. However, I am not able to figure out this compilation error: MainActivityModule must be set which happens in my MainActivity. If someone will try to throw some light on this error. I would really be glad.

My MainActivity

public class MainActivity extends BaseActivity {

@Inject
JsonMethods mJsonMethods;
...
in OnCreate
Weather.getComponent().injectMainActivity(this);

My Weather class

public class Weather extends Application {

private static WeatherComponent sWeatherComponent;

@Override
public void onCreate() {
    super.onCreate();
    sWeatherComponent = DaggerWeatherComponent.builder()
            .contextModule(new ContextModule(this))
            .build();
}

public static WeatherComponent getComponent() {
    return sWeatherComponent;
}
}

WeatherComponent

@Component(modules = MainActivityModule.class)
public interface WeatherComponent {
    void injectMainActivity(MainActivity mainActivity);
}

MainAcitivtyModule

@Module(includes = NetworkModule.class)
public class MainActivityModule {

private final MainActivity mainActivity;

public MainActivityModule(MainActivity mainActivity) {
    this.mainActivity = mainActivity;
}

@Provides
@WeatherApplicationScope
public JsonMethods provideJsonMethods(Retrofit retrofit) {
    return new JsonMethods(mainActivity, retrofit);
}

NetworkModule return Retrofit, Gson, OkHttpClient

Error MainActivityModule must be set appears in this code:

sWeatherComponent = DaggerWeatherComponent.builder()
                .contextModule(new ContextModule(this))
                .build();

Upvotes: 6

Views: 3091

Answers (1)

Abu Yousuf
Abu Yousuf

Reputation: 6107

You have to create a MainActivityModule instance like you created ContextModule instance. Your MainActivityModule don't have any default constructor so Dagger can't created an instance of MainActivityModule. So create an MainActivityModule instance and set it to Dagger graph.

    sWeatherComponent = DaggerWeatherComponent.builder()
        .contextModule(new ContextModule(this))
        .mainActivityModule(new MainActivityModule(....))
        .build();

If modules don't have any user defined constructor then Dagger will automatically create an instance via default constructor when required.

Upvotes: 10

Related Questions