Dagger 2, supertype Injector is zero

I am trying to implement DI using Dagger 2. I am using this article as an example, but I am getting NullPointerExceptionin the generated class.

Here is my stack trace:

E/AndroidRuntime:  Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void dagger.MembersInjector.injectMembers(java.lang.Object)' on a null object reference
E/AndroidRuntime:     at me.cullycross.moody.activities.AuthActivity_MembersInjector.injectMembers(AuthActivity_MembersInjector.java:29)
E/AndroidRuntime:     at me.cullycross.moody.activities.AuthActivity_MembersInjector.injectMembers(AuthActivity_MembersInjector.java:9)
E/AndroidRuntime:     at me.cullycross.moody.di.components.DaggerAppComponent$LogInComponentImpl.inject(DaggerAppComponent.java:186)
E/AndroidRuntime:     at me.cullycross.moody.activities.AuthActivity.inject(AuthActivity.java:59)
E/AndroidRuntime:     at me.cullycross.moody.activities.AbstractRestClientActivity.onCreate(AbstractRestClientActivity.java:21)
E/AndroidRuntime:     at me.cullycross.moody.activities.AuthActivity.onCreate(AuthActivity.java:50)

AbstractRestClientActivity.java:

public abstract class AbstractRestClientActivity extends RxAppCompatActivity {

  @Inject protected RestClient.ApiService mApiService; // if I comment or delete this line everything works like a charm

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    inject();
  }

  protected abstract void inject();
}

AuthActivity.java (I removed utilities, onclick listeners, etc.):

public class AuthActivity extends AbstractRestClientActivity {

  @Inject TokenUtils mTokenUtils;
  @Inject CallbackManager mCallbackManager; // it about facebook

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_auth);
  }

  @Override protected void inject() {
    MoodyApplication.getApp(this).getAppComponent().logInComponent(new LogInModule()).inject(this);
  }
}

MoodyApplication.java:

public class MoodyApplication extends Application {

  private AppComponent mAppComponent;

  public static MoodyApplication getApp(Context context) {
    return (MoodyApplication) context.getApplicationContext();
  }

  @Override public void onCreate() {
    super.onCreate();
    initAppComponent();
  }

  private void initAppComponent() {
    mAppComponent = DaggerAppComponent.builder()
        .networkModule(new NetworkModule())
        .utilModule(new UtilModule())
        .build();
  }

  public AppComponent getAppComponent() {
    return mAppComponent;
  }
}

AppComponent.java:

@Singleton @Component(modules = { UtilModule.class, NetworkModule.class })
public interface AppComponent {
  LogInComponent logInComponent(LogInModule logInModule);
  void inject(AbstractRestClientActivity activity);
}

LogInComponent.java:

@ActivityScope @Subcomponent(modules = { LogInModule.class }) public interface LogInComponent {
  void inject(AuthActivity activity);
}

UtilModule.java:

@Module public class UtilModule {
  @Provides @Singleton @Named("expose") Gson provideExposeGson() {
    return new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
        .excludeFieldsWithoutExposeAnnotation()
        .create();
  }

  @Provides @Singleton TokenUtils provideTokenUtils() {
    return new TokenUtils();
  }
}

NetworkModule.java:

@Module public class NetworkModule {
  @Provides @Singleton RestClient provideRestClient(@Named("expose") Gson gson) {
    return new RestClient(gson);
  }

  @Provides @Singleton RestClient.ApiService provideApiService(RestClient client) {
    return client.getApiService();
  }
}

LogInModule.java:

@Module public class LogInModule {
  @Provides @ActivityScope CallbackManager provideCallbackManager() {
    return CallbackManager.Factory.create();
  }
}

This generates a method in the generated class AuthActivity_MembersInjectorthat calls NPE:

  @Override
  public void injectMembers(AuthActivity instance) {  
    if (instance == null) {
      throw new NullPointerException("Cannot inject members into a null reference");
    }
    supertypeInjector.injectMembers(instance); // here is NPE, supertypeInjector is null
    instance.mTokenUtils = mTokenUtilsProvider.get();
    instance.mCallbackManager = mCallbackManagerProvider.get();
  }

Any help would be greatly appreciated.

+4
source share
1 answer

issue ( ).

, , .

:

AppComponent.java:

@Singleton @Component(modules = { UtilModule.class, NetworkModule.class })
public interface AppComponent {
  LogInComponent logInComponent(LogInModule logInModule);
  //void inject(AbstractRestClientActivity activity); // this one
}
+2

Source: https://habr.com/ru/post/1612041/


All Articles