2015-02-25 20 views
8

Für die Dinge einfach zu machen, nehme ich an EmailValidator von Apache Validatoren in meine Tätigkeit injizieren wollen:Dagger2 - null statt injiziert Objekt

public class MainActivity extends FragmentActivity { 

    @Inject 
    EmailValidator emailValidator; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

Ich habe eine MainModule Klasse:

@Module 
public class MainModule { 

    @Provides 
    public EmailValidator providesEmailValidator() { 
     return EmailValidator.getInstance(); 
    } 
} 

und MainComponent Schnittstelle:

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

    EmailValidator getEmailValidator(); 
} 

Wenn ich versuche, meinen Validator in Aktivität zu verwenden, bekomme ich eine Nullpoi nter Ausnahme:

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

Offensichtlich fehlt mir etwas. Ich weiß, dass Dolch eine Komponentenimplementierung für mich erstellt. Soll ich es benutzen? Wie?

Wenn ich in meinem onCreate Verfahren folgendes tun:

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

dann funktioniert alles einwandfrei.

Aber ich möchte in der Lage sein, @Inject Annotation überall (wahrscheinlich auf Setter/Konstruktor anstelle eines Feldes) stattdessen zu verwenden.

Was fehlt mir?

Ich habe etwas ähnliches mit dagger1 und es hat funktioniert. Natürlich musste ich ObjecGraph.inject(this) in Aktivität aufrufen. Was ist das Äquivalent von Dolch2?

EDIT:

Ok, so habe ich eine Lösung gefunden. Wenn jemand schon einmal ein solches Problem haben, gibt es einige Schnipsel:

1) Ich habe eine Anwendung Klasse erstellt haben:

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) In AndroidManifest.xml:

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

3) Und schließlich, in der Aktivitätsklasse, wo ich einige Komponenten diese zwei hässlichen Linien injizieren möchte:

+0

Ich kann 'inject' nicht auf meiner Komponente aufrufen. Auch die Dagger_MainComponent-Syntax scheint sich nur in DaggerMainComponent geändert zu haben. –

Antwort

9

Looks wie Sie Ihre Komponente zu bauen, wie in benötigen:

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

Normalerweise tun Sie dies in der onCreate Methode Ihrer Anwendung, in this fashion.

Eine gute Ressource, die Ihnen helfen kann, ist die example apps in the Dagger 2 repo.

Ich fand auch diese PR hilfreich, von einem suggested update to Jake Wharton's u2020 sample app (von der Hauptdagger 2 Engineer). Es gibt einen guten Überblick über die Änderungen, die Sie vornehmen müssen, wenn Sie von Dolch 1 zu 2 gehen, und das ist offensichtlich das, was he points people to as well ist.

+0

Bereits versucht, dass, immer noch eine Ausnahme bekommen. – slnowak

+0

Ich habe es herausgefunden. Wegen nützlicher Links akzeptiere ich diese Antwort :) – slnowak

+0

Froh, dass du es behoben hast! Aus Ihren obigen Bearbeitungen sieht es so aus, als hätten Sie einen Fall, in dem keiner Ihrer Modulkonstruktoren Konstruktorargumente benötigt. Wenn das der Fall ist, wird die Komponente eine create-Methode haben, die Sie stattdessen verwenden können. Die Chancen stehen aber nach einer Weile, müssen Sie Ihre Anwendung zu übergeben in einem dieser Module und wenn das passiert, werden Sie mit dem Erbauer zurückgreifen müssen, wie beschrieben, oben. – gMale

Verwandte Themen