2016-03-28 15 views
3

Ich habe eine gist erstellt, die das Problem hervorhebt, in das ich hineinlaufe. Ich verwende ein Anwendungsmodul, um eine Firebase Abhängigkeit für mich zur Verfügung zu stellen, anderswo zu injizieren.Nullreferenz auf Dolch 2 @Inject

Wenn ich versuche, @Inject Firebase mFirebase in der Datenschicht, die Abhängigkeit nie erfüllt ist.

Ich versuche, die Context aus meinen anderen Schichten zu halten, aber der Firebase Dienst hängt davon ab. Ich bin daran interessiert, andere Muster zu lernen, um zu helfen, Android Klassen aus meiner Geschäftslogik herauszuhalten.

FirebaseService.java

public class FirebaseService { 

@Inject Firebase mFirebaseRef; //NEVER GET'S INJECTED! 

    @Override 
    public LoginResult signinWithEmail(final String email, final String password) { 
     mFirebaseRef.dostuff(); //THIS REFERENCE DOESN'T GET INJECTED! 
    } 
} 

ApplicationModule

@Provides 
@Singleton 
Firebase provideFirebase(@ApplicationContext Context context) { 
    Firebase.setAndroidContext(context); 
    return new Firebase(Util.FIREBASE_URL); 
} 

ApplicationComponent

@Singleton 
@Component(modules = ApplicationModule.class) 
public interface ApplicationComponent { 

    @ApplicationContext Context context(); 
    Application application(); 
    Firebase firebase(); 
} 

MyActivity

public class MyActivity extends AppCompatActivity { 

private ActivityComponent mActivityComponent; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

public ActivityComponent getActivityComponent() { 
    if (mActivityComponent == null) { 
     mActivityComponent = DaggerActivityComponent.builder() 
       .activityModule(new ActivityModule(this)) 
       .applicationComponent(MyApplication.get(this).getComponent()) 
       .build(); 
    } 
    return mActivityComponent; 
} 

Das Beispiel vollständige Code ist auf github

+2

Links zum Code zu haben ist nicht genug, da Links dazu neigen, zu verrotten (außerdem müssen wir auf eine andere Seite gehen und lesen). Bitte fügen Sie Ihrer Frage den Mindestcode hinzu. –

Antwort

4

ein Feld mit @Inject Anmerkungen versehen ist nicht genug für die Feld Injektion zu arbeiten. Da ist keine Magie involviert, du musst Dagger nur sagen, dass er die Injektion machen soll.

Fügen Sie zunächst diese Methode, um Ihre ApplicationComponent:

void inject(FirebaseService firebaseService); 

Dann rufen Sie diese Methode von Ihrem FirebaseService (Ich denke, es ist ein Android-Service, so fügen Sie diese in die onCreate-Methode):

applicationComponent.inject(this); 

Dies sollte den Trick tun. Es gibt eine gute Antwort auf ein ähnliches Problem here.

EDIT

Ich habe in Ihrem Repository geschaut und ich glaube, Sie brauchen nicht einmal Feldeinkopplung in diesem Fall. Sie können die Firebase Abhängigkeit nur durch einen Konstruktor angeben. Hier ist Ihre @Provides Methode:

@Provides 
@Singleton 
LoginService provideLoginService() { 
    return new FirebaseLoginService(); 
} 

hinzufügen Firebase als Parameter an sie und übergeben es an den FirebaseLoginService Konstruktor:

@Provides 
@Singleton 
LoginService provideLoginService(Firebase firebase) { 
    return new FirebaseLoginService(firebase); 
} 

Der Konstruktor:

public FirebaseLoginService(Firebase firebase) { 
    this.mFirebaseRef = firebase; 
} 

Entfernen Sie die @Inject Anmerkung aus Ihrem mFirebaseRef Feld, da es nicht mehr benötigt wird.

Hier ist die entsprechende pull request.

+0

Danke für die Antwort, der 'FirebaseService' ist kein richtiger Android Service, sondern ein API Helper Service. Wie bekomme ich einen Verweis auf 'applicationComponent' innerhalb des FirebaseService, um das' .inject (this) 'auszuführen? – Reustonium

+1

@Reustonium, ich habe mir Ihr Repository angesehen und meine Antwort bearbeitet. –

+0

@Reustonium, beantwortet Ihre Frage in Bezug auf die 'applicationComponent' Referenz - es ist in Ihrer' Application' Klasse deklariert, so dass Sie 'Context' dem' FirebaseLoginService' bereitstellen müssen und es dann aus dem 'Context' holen. –