匕首 2,supertypeInjector 为空

Dagger 2, supertypeInjector is null

我正在尝试使用 Dagger 2 实现 DI。我使用此 article 作为示例,但我在生成的 class.

中得到 NullPointerException

这是我的堆栈跟踪:

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(我删除了 util 方法、onclick 侦听器等):

public class AuthActivity extends AbstractRestClientActivity {

  @Inject TokenUtils mTokenUtils;
  @Inject CallbackManager mCallbackManager; // it's 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();
  }
}

这里是generatedclassAuthActivity_MembersInjector中的generated方法,引发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();
  }

非常感谢任何帮助。

我打开了一个 issue(它是重复的)。

似乎有冲突,当你在你的超级组件中为你的超类注入时。

我解决了这个删除一行:

AppComponent.java:

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