2015-10-17 88 views
4

我試圖用Dagger 2實現DI。我用這個article作爲例子,但是我在生成的類中得到了NullPointerExceptionDagger 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生成方法。

回答

2

我打開了issue(它是重複的)。

似乎它會發生衝突,當你的超級組件中有一個針對你的超類的注入。

我解決了這個刪除一行:

AppComponent.java:

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