2017-12-02 190 views
0

下面是活動,它仍然使用舊的DI模型,我試圖遷移到Dagger2(使用Dagger-android)。我想注入Presenter,正如你所看到的,一個依賴是'NewProjectDisplayer',它是活動中的自定義視圖。如何在Dagger2中提供視圖?

enter image description here

這是 'NewProjectDisplayer' 我想要提供給演示

enter image description here

我有一個模塊(的AppModule),其提供像ProjectService全局相關性,login服務等

下面是我遇到麻煩的NewProjectModule。與該活動相關的其中一個依賴是'NewProjectDisplayer'。我不知道我能提供給它..

@Module 
public class NewProjectActivityModule { 

    @Provides 
    NewProjectDisplayer provideNewProjectDisplayer(View view) { 
     // ??? return view.findViewById(R.id.create_project_view); 
    } 

    @Provides 
    NewProjectNavigator provideNewProjectNavigator(BaseActivity baseActivity) { 
     return new AndroidNewProjectNavigator(baseActivity); 
    } 

    @Provides 
    NewProjectPresenter provideNewProjectPresenter(NewProjectDisplayer displayer, // 
                ProjectService projectService, 
                LoginService loginService, 
                UserService userService, 
                NewProjectNavigator navigator, // 
                PermissionHandler permissionHandler,// 
                CropImageHandler cropImageHandler,// 
                RxSchedulers schedulers) { 
     return new NewProjectPresenter(displayer, projectService, loginService, 
       userService, navigator, permissionHandler, cropImageHandler, schedulers); 
    } 

} 

我怎麼能提供這種「NewProjectDisplayer」,使演示者可以創建和注入?我正在使用匕首 - 機器人。

回答

0

您無法在與dagger-android兼容的活動模塊上提供或執行findViewById,原因之一是模塊是在視圖實際位於層次結構之前創建的。另外,這樣做不是一個好習慣,但如果你仍然相信你應該這樣做,你可以嘗試創建一個子組件,它將有一個提供視圖依賴的模塊,並且它必須在setContentView之後創建,如由@elmorabea建議。

+0

是啊,這很糟糕,我想我可以使活動實現相同的顯示器界面和委託給複合視圖,但這會創建非常醜陋的代碼。我認爲最簡單的事情就是用碎片替換所有視圖 – Linxy

+0

您也可以在構造函數之外傳遞視圖的實例。許多人用'attach()'和'detach()'方法做這件事。 – mcassiano

+0

是啊,使用'附加(NewProjectDisplayer顯示器)..'爲我工作,謝謝 – Linxy

0

只是解決你的問題,不知道你是否應該提供與匕首的意見,雖然。

改變你的模塊是這樣的。

@Module 
public class NewProjectActivityModule { 

private View view; 

public NewProjectActivityModule (View view) { 
    this.view = view; 
} 

@Provides 
NewProjectDisplayer provideNewProjectDisplayer(View view) { 
    return view; 
} 

} 

然而,無論你在創建Dagger組件,你都需要做類似的事情。

YourDaggerComponent.builder().newProjectActivityModule(new NewProjectActivityModule (yourViewInstance)).build(); 

否則它會在運行時崩潰。

+0

這是給老匕首吧?我試圖使用新的匕首android和那裏你不建立組件,而只是使用AndroidInjection.inject(this) – Linxy

相關問題