我尝试使用Dagger 2实现DI。我使用此article作为示例,但我在生成的类中得到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();
}
}
这是生成的类AuthActivity_MembersInjector
中生成的方法,它引发了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();
}
非常感谢任何帮助。
答案 0 :(得分:3)
我打开了一个issue(它是重复的)。
看起来好像冲突了,当你的超级组件中有超级注入时。
我解决了这个删除一行:
AppComponent.java:
@Singleton @Component(modules = { UtilModule.class, NetworkModule.class })
public interface AppComponent {
LogInComponent logInComponent(LogInModule logInModule);
//void inject(AbstractRestClientActivity activity); // this one
}