2016-12-22 38 views
2

Ich lese Dokumentation über Dagger2. Die Sache ist, ich klar haben, wie eine Klasse injizieren wie hat ContextthisDolch2 alles injizieren?

mit Aber meine Zweifel ist mit der folgenden Klasse zum Beispiel:

public class SocialControler{ 

private ImageView twitterLogo; 
private ImageView googleLogo; 

public SocialControler(ImageView twitter, ImageView google){ 
twitterLogo = twitter; 
googleLogo = google; 
} 
//Getters and Setters 

} 

Also in meinem MainActivity Ich werde

haben so etwas wie dieses
SocialControler mSocial = new SocialControler(mTwitterLogo, mGoogleLogo); 

Sollte ich diese Klasse unter Verwendung @Inject Anotation statt new, so nicht mehr new auf unserer Aktivität injizieren? Wenn ja Wie?

Ich bin in der @Mudule stecken. Wie kann ich einen Einblick in de Module bieten?

@Module 
public class AppModuleSocialMediaManager { 


    @Provides 
    public MainActivity provideActivity(){ 
     return new MainActivity(); 
    } 

    @Provides 
    public SocialMediaClickManager provideMediaManager(MainActivity mainActivity, View twitterLogo, View googleLogo) { 
     return new SocialMediaClickManager(mainActivity); 
    } 

    @Provides 
    public View provideTwitter(){ 
     return ? 
    //from here how I can provide a View 
    } 
} 
+0

ich eigentlich nicht bekommen, was Sie wollen, aber Sie können die Ansicht bieten Passieren der MainActivity als Parameter wie '@Provides public View provideTwitter (MainActivity activity) {...}' – Blackkara

+0

Ich möchte wissen, ob wir vermeiden müssen, neue in unserem Code zu verwenden und @inject für alle Klassen, die wir verwenden dagger2 – JoCuTo

Antwort

1

Ich würde die Architektur nicht empfehlen Sie verwenden Ihre Anwendung zu erstellen, dh Ihre Controller auf genaue Ansichten abhängig machen, aber wenn Sie mit, dass gut geht, dann können Sie Ihr Modul wie folgt implementieren:

@Module 
public class AppModuleSocialMediaManager { 
    private final MainActivity mainActivity; 

    public AppModuleSocialMediaManager(MainActivity mainActivity) { 
     this.mainActivity = mainActivity; 
    } 

    @Provides 
    @Named("twitter_view") 
    View provideTwitterView() { 
     return mainActivity.findViewById(..); 
    } 

    @Provides 
    @Named("google_view") 
    View provideGoogleView() { 
     return mainActivity.findViewById(..); 
    } 

    @Provides 
    SocialController provideSocialController(@Named("twitter_view") View twitterView, @Named("google_view") View googleView) { 
     return new SocialController(twitterView, googleView); 
    } 

} 

Dann müssen Sie eine andere Komponente deklarieren. Sagen wir, es ist MainActivityComponent:

@Component(modules = AppModuleSocialMediaManager.class) 
public interface MainActivityComponent { 
    void inject(MainActivity activity); 
} 

Danach in Ihrer Aktivität können Sie etwas tun, wie folgt aus:

public class MainActivity extends Activity { 
    @Inject 
    SocialController socialController; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     DaggerMainActivityComponent.Builder() 
      .appModuleSocialMediaManager(new AppModuleSocialMediaManager(this)) 
      .build() 
      .inject(this); 

     socialController.doSomething(); 
    } 

} 
+0

vielen Dank verwenden , was meinst du mit - machen Sie Ihre Controller abhängig von genauen Ansichten? – JoCuTo

+2

Ihr Controller hängt von Ansichten ab, die von Aktivitäten stammen - Twitter-Logo und Google-Logo. Daher können Sie nicht Unit-Test sie, weil es so etwas wie Android-View in Unit-Tests für Android nicht gibt. Im Grunde bedeutet das nur, dass Ihr Code nicht entkoppelt ist und Sie Modelle, Ansichten und Geschäftslogik miteinander kombinieren. Lies über MVP zum Beispiel https://github.com/konmik/konmik.github.io/wiki/Introduction-to-Model-View-Presenter-on-Android. Es ist gerade ziemlich populär. Sie können Ideen finden, wie Sie Ihren Code verbessern können. –

+0

ah ok ist für SocialControler.class Ist es nicht? ist nur eine Klasse, wie man den Zustand einiger Animationen über imagesViews auf meiner MainActivity kontrolliert. – JoCuTo

Verwandte Themen