2016-03-28 33 views
3

我創建了一個gist,突出顯示了我遇到的問題。我正在使用應用程序模塊爲我提供一個Firebase依賴項,以便在其他地方注入。Dagger 2上的空引用@Inject

當我嘗試在數據層中嘗試@Inject Firebase mFirebase時,依賴性永遠不會滿足。

我試圖讓Context超出我的其他層,但Firebase服務取決於它。我有興趣學習其他模式,以幫助保持Android課程脫離我的業務邏輯。

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

完整的代碼的例子是github

+2

鏈接到代碼是不夠的,因爲鏈接傾向於腐爛(加上它需要我們出去到另一個網站和閱讀)。請添加最小代碼到您的問題。 –

回答

4

註解字段與@Inject是不夠的場注入工作。沒有魔法,你只需告訴Dagger做注射。

首先,這種方法添加到您的ApplicationComponent

void inject(FirebaseService firebaseService); 

然後,調用這個方法您FirebaseService(我想這是一個Android的服務,所以這增加了onCreate方法):

applicationComponent.inject(this); 

這應該是訣竅。對於類似問題here有一個很好的答案。

編輯

我看過你們的資料庫,我想你甚至不需要在這種情況下字段注入。您可以通過構造函數提供Firebase依賴項。這是你的@Provides方法:

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

添加Firebase作爲參數傳遞給它,並將它傳遞給FirebaseLoginService構造:

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

構造:

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

從取出@Inject註釋您因爲它不再需要,因此可以使用mFirebaseRef字段。

下面是相應的pull request

+0

感謝您的回覆,FirebaseService不是一個適合的Android服務,它是一個API幫助器服務。 如何獲得對FirebaseService中的'applicationComponent'的引用以執行'.inject(this)'? – Reustonium

+1

@Reustonium,我看了你的存儲庫並編輯了我的答案。 –

+0

@Reustonium,回答你關於'applicationComponent'引用的問題 - 它是在你的'Application'類中聲明的,所以你必須爲'FirebaseLoginService'提供'Context',然後從'Context'中獲取它。 –

相關問題