2017-12-02 12 views
0

以下はアクティビティです。まだ古いDIモデルを使用していますが、私はDagger2(dagger-android)に移行しようとしています。私はPresenterを注入したいと思います。あなたが見ることができるように、アクティビティのカスタムビューである「NewProjectDisplayer」が依存関係の1つです。Dagger2でビューを提供するには?

enter image description here

これは私がLoginServiceなどProjectService、のような世界的な依存関係を提供するモジュール(AppModuleを)持っているプレゼンター

enter image description here

に提供したい 'NewProjectDisplayer' です

以下は私が問題を抱えているNewProjectModuleです。アクティビティに関連付けられている依存関係の1つは、 '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を指定することはできません。その理由の1つは、ビューが実際に階層上に作成される前にモジュールが作成されているためです。また、これを行うのは良い方法ではありませんが、まだこれを行う必要がある場合は、ビューの依存関係を提供するモジュールを持つサブコンポーネントを作成してみてください。setContentViewの後に作成する必要があります。 @elmorabeaによって提案された

+0

うん、それは、同じディスプレーヤーインターフェイスを実装して、それは本当に醜いコードを作成します。私は最も簡単なのは、すべてのビューをフラグメントと置き換えることだけだと思う​​。 – Linxy

+0

コンストラクタの外側でビューのインスタンスを渡すこともできます。多くの人が 'attach()'と 'detach()'メソッドでこれを行います。 – mcassiano

+0

ええ、 'attach(NewProjectDisplayer displayer).. 'を使って私のために働いた、ありがとう – 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

これは、古い短剣の権利ですか?私は新しいdagger-androidを使用しようとしています。コンポーネントを作成するのではなく、代わりにAndroidInjection.inject(これ)を使用してください。 – Linxy

関連する問題