2016-03-28 16 views
3

üzerinde atıfta bulunarak Çalıştığım sorunu vurgulayan bir gist oluşturdum. Başka bir yere enjekte etmem için Firebase bağımlılığı sağlamak için bir Uygulama Modülü kullanıyorum. Veri katmanında, @Inject Firebase mFirebase numaralı bağlantıya çalıştığımda, bağımlılığın hiçbir zaman tatmin edilmediğini.Hançer 2 @Nuthern

Context diğer katmanlarımdan uzak tutmaya çalışıyorum, ancak Firebase hizmeti buna bağlı. Android sınıflarını iş mantığım dışında tutmaya yardımcı olmak için başka modeller öğrenmek istiyorum.

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

tam kod örneği github

+2

Kodun bağlantıları yeterli değildir, çünkü bağlantılar çürümeye eğilimlidir (artı başka bir siteye gitmemizi ve okumanızı gerektirir). Lütfen sorunuza minimum kodu ekleyin. –

cevap

4

@Inject bir alan annotating üzerinde alan püskürtme çalışması için yeterli değildir. Hiç sihir yok, sadece Dagger'a enjeksiyonu yapmasını söylemelisin.

İlk olarak, ApplicationComponent için bu yöntemi ekleyin:

Sonra
void inject(FirebaseService firebaseService); 

, bu yöntemi çağırın sizin FirebaseService (Ben bir Android hizmet sanırım, bu yüzden onCreate yönteme bu ekleyin):

applicationComponent.inject(this); 

Bu hile yapmalı. Benzer bir soruna here büyük bir cevap var.

DÜZENLEME

Ben senin depo baktım ve ben bile yok bu durumda alan enjeksiyonu gerektiğini düşünüyorum. Bir kurucu aracılığıyla Firebase bağımlılığını sağlayabilirsiniz.

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

yapıcı:

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

kendisine parametre olarak Firebase ekleyin ve FirebaseLoginService yapıcısına geçmek: İşte @Provides yöntemidir

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

den @Inject ek açıklama kaldırılsın Artık gerekmediğinden mFirebaseRef alan.

İşte ilgili pull request.

+0

Yanıt için teşekkürler, 'FirebaseService' bir Android Hizmeti uygun değil, bir API Yardımcı Hizmet. ".inject (this)" işlevini gerçekleştirmek için FirebaseService içindeki "applicationComponent" öğesine nasıl başvuru yapabilirim? – Reustonium

+1

@Reustonium, Deponuza baktım ve cevabımı düzenledim. –

+0

@Reustonium, 'applicationComponent' referansıyla ilgili sorunuzu yanıtlayarak, 'Application' sınıfınızda bildirilir, böylece 'ContebaseLoginService' öğesine 'Context' sağlamanız ve daha sonra 'Context''ten elde etmeniz gerekir. –

İlgili konular