2015-02-25 12 views
8

, benim faaliyeti içine apache doğrulayıcıları gelen EmailValidator enjekte etmek istediğinizi varsayalım arabirim:Dagger2 boş yerine enjekte ait her şeyi basitleştirme için nesne

@Singleton 
@Component(modules = MainModule.class) 
public interface MainComponent { 

    EmailValidator getEmailValidator(); 
} 

Değerleme aracımı etkinlikte kullanmaya çalışırken, bir nullpoi alıyorum İstisna:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean org.apache.commons.validator.routines.EmailValidator.isValid(java.lang.String)' on a null object reference 

Açıkçası bir şey kaçırıyorum. Ben hançerin benim için bileşen uygulaması yarattığını biliyorum. Kullanmalı mıyım? Nasıl? Benim onCreate yönteminde aşağıdaki yaparsanız

:

 emailValidator = Dagger_MainComponent.create().getEmailValidator(); 

sonra her şey gayet iyi çalışıyor.

Ama bunun yerine @Inject (herhangi bir alan yerine setter/yapıcı yerine) ek açıklama eklemek mümkün.

Neyi eksik?

dagger1 ile benzer bir şey yaptım ve işe yaradı. Tabii ki aktivitede ObjecGraph.inject(this)'u aramam gerekiyordu. Davis2 eşdeğeri nedir?

DÜZENLEME:

Tamam, bu yüzden bir çözüm bulduk. AndroidManifest.xml yılında

public class EmailSenderApplication extends Application { 

    private MainComponent component; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     component = Dagger_MainComponent 
       .create(); 

     component.inject(this); 
    } 

    public MainComponent component() { 
     return component; 
    } 
} 

2): Ben bir uygulama sınıfı oluşturduk

1): Hiç kimse böyle bir sorun olacaksa, bazı parçacıkları vardır

<application 
     android:name=".EmailSenderApplication" 
     ... 

3 Son olarak, bu iki çirkin cehennem çizgisi gibi bazı bileşenleri enjekte etmek istediğim aktivite sınıfında:

component = ((EmailSenderApplication) getApplication()).component(); 
component.inject(this); 
+0

Bileşenimde 'inject 'diyemiyorum. Ayrıca Dagger_MainComponent sözdizimi sadece DaggerMainComponent olarak değişmiş gibi görünüyor. –

cevap

9

İçinde gibi bileşeni oluşturmak gerekiyor gibi: Genellikle

component = Dagger_ MainComponent.builder() 
     .mainModule(new MainModule()) 
     .build(); 

, size Uygulama, in this fashion arasında onCreate yönteminde bunu.

Size yardımcı olabilecek iyi bir kaynak, example apps in the Dagger 2 repo.

Ayrıca bu PR'yi suggested update to Jake Wharton's u2020 sample app'dan (ana Dagger 2 Engineer'dan) faydalı buldum. Hançer 1'den 2'ye giderken yapmanız gereken değişiklikler hakkında iyi bir genel bakış sağlar ve görünüşe göre he points people to as well.

+0

Zaten bunu denedim, hala istisna oluyor. – slnowak

+0

Bunu çözdüm. Yararlı linkler nedeniyle, bu cevabı kabul ediyorum :) – slnowak

+0

Memnun kaldın! Yukarıdaki düzenlemelerinizden, modül kurucularından hiçbirinin yapıcı argümanları gerektirmediği bir durumun olduğu anlaşılıyor. Bu doğru olduğunda, bileşen bunun yerine kullanmanız için bir 'create' yöntemine sahip olacaktır. Şans eseri, bir süre sonra, uygulamanızı bu modüllerden birine aktarmanız gerekecek ve bu gerçekleştiğinde, yukarıda açıklandığı gibi kurucuyu kullanmaya geri dönmeniz gerekecektir. – gMale