2015-10-17 1 views
4

J'essaie d'implémenter DI en utilisant Dagger 2. J'utilise ce article par exemple, mais je reçois NullPointerException dans la classe générée.Dague 2, supertypeInjector est null

Voici mon 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; // 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 (I, supprimé les méthodes util onclick auditeurs, etc.):

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(); 
    } 
} 

méthode est générée ici en classe générée AuthActivity_MembersInjector, ce qui provoque 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(); 
    } 

Toute aide serait très apprécié.

Répondre

2

J'ai ouvert un issue (il était en double).

On dirait que cela est en conflit, quand dans votre super-composant vous avez une injection pour votre superclasse.

I résolu ce enlevant une ligne:

AppComponent.java:

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