2016-12-22 97 views
2

我正在閱讀關於Dagger2的文檔。事情是我必須清楚如何注入是如何Context使用thisDagger2注入一切?

一類,但我懷疑是下面的類,例如:

public class SocialControler{ 

private ImageView twitterLogo; 
private ImageView googleLogo; 

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

} 
MainActivity我會有這樣的事情

所以

SocialControler mSocial = new SocialControler(mTwitterLogo, mGoogleLogo); 

我是否應該使用@Inject而不是new來代替這個類別,因此我們的活動中沒有更多new?如果是的話如何?我的卡在@Mudule。如何在Module內提供視圖?

@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

我實際上並沒有得到自己想要的東西,但你可以提供通過在MainActivity作爲視圖參數像'@Provides public View providesTwitter(MainActivity activity){...}' – Blackkara

+0

我想知道,如果我們必須避免在我們的代碼中使用新的和使用@inject所有我們使用dagger2 – JoCuTo

回答

1

我不建議你使用來構建應用程序,即讓你的控制器依賴於準確的看法架構,但如果你的罰款與那麼你可以實現你的模塊是這樣的:

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

} 

然後你需要聲明另一個組件。比方說,這是MainActivityComponent

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

之後,在你的活動,你可以做這樣的事情:

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

clas ,你是什麼意思 - 讓你的控制器依賴於確切的視圖? – JoCuTo

+2

您的控制器取決於來自活動的視圖 - twitter徽標和谷歌徽標。因此你不能單元測試它們,因爲在android的單元測試中沒有android視圖這樣的事情。基本上,這隻意味着你的代碼不是分離的,而是混合了模型,視圖和業務邏輯。閱讀關於MVP的例子https://github.com/konmik/konmik.github.io/wiki/Introduction-to-Model-View-Presenter-on-Android。現在很受歡迎。你可能會發現如何讓你的代碼更好。 –

+0

啊確定是爲SocialControler.class不是嗎?只是一個類如何控制我的MainActivity上的一些動畫imageViews的狀態。 – JoCuTo