I am trying to implement DI using Dagger 2. I am using this article as an example, but I am getting NullPointerException
in 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;
@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;
@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_MembersInjector
that calls NPE:
@Override
public void injectMembers(AuthActivity instance) {
if (instance == null) {
throw new NullPointerException("Cannot inject members into a null reference");
}
supertypeInjector.injectMembers(instance);
instance.mTokenUtils = mTokenUtilsProvider.get();
instance.mCallbackManager = mCallbackManagerProvider.get();
}
Any help would be greatly appreciated.