4
我試圖用Dagger 2實現DI。我用這個article作爲例子,但是我在生成的類中得到了NullPointerException
。Dagger 2,supertypeInjector爲null
這裏是我的堆棧跟蹤:
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:
@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();
}
任何幫助將是非常讚賞:
@Module public class LogInModule {
@Provides @ActivityScope CallbackManager provideCallbackManager() {
return CallbackManager.Factory.create();
}
}
在這裏,在產生AuthActivity_MembersInjector
類,它引發NPE生成方法。