2016-05-08 6 views
0

での活動への参照を取得することができ、ダガー2を使用してMVPを実装しよう - どのように私は私がMVPとダガーでアプリをセットアップしようとしています提供プレゼンター

ビューがどの実装Activityですビューインタフェース。

public class OverviewActivity extends AppCompatActivity implements OverviewContract.View { 

    @Inject OverviewPresenter presenter; 

    @BindView(R.id.history_days) ListView HistoryLabels; 
    @BindView(R.id.history_events) ListView HistoryEvents; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_overview); 
     ButterKnife.bind(this); 

     DaggerOverviewComponent.create().inject(this); 

    } 

    @Override 
    public void showHistory(List<Exercise> history) { 
     // ... 
    } 

    @Override 
    public void updateScoreSlider(float value) { 
     // ... 
    } 

    @OnClick(R.id.add_event_button) 
    public void addEvent(View v){ 
     // ... 
    } 
} 

ので

public class OverviewPresenter implements OverviewContract.Events { 

    OverviewContract.View view; 

    public OverviewPresenter(OverviewContract.View overviewView) { 
     view = overviewView; 

    } 

    @Override 
    public void loadHistory() { 
     // TODO 
    } 

    @Override 
    public void addNewEvent() { 
     // TODO 
    } 
} 
私は問題を抱えています

は、プレゼンターのためのプロバイダであるようプレゼンターが見えます。 OverviewPresenterの依存関係の1つはOverviewActivityですが、のインスタンスをOverviewPresenterに挿入するにはどうすればよいですか?

@Module 
public class PresenterModule { 

    @Provides 
    static OverviewPresenter provideOverviewPresenter(){ 
     return new OverviewPresenter(/* pass in the instance of the activity here?? */); 
    } 
} 

マイコンポーネントは、私はまだ短剣のまわりで私の頭をラップしようとしています、これは道オフベースであるなら、私を許し

@Component(modules = {PresenterModule.class}) 
public interface OverviewComponent { 

    void inject(OverviewActivity overviewActivity); 
} 

のように見えます。

TLDR:
OverviewActivityにOverviewActivityのインスタンスが注入されたOverviewPresenterを使用してOverviewActivityを注入できるようにするにはどうすればよいですか?

答えて

9
  • ダガーが作成できないものを提供するには、モジュールを使用する必要があります。
  • @Injectでコンストラクタに注釈を付けることができるプレゼンターを提供するには、モジュール—を使用する必要はありません。

ビューではビューが実装されているため、ビューを自分で作成することはできませんし、短剣で作成することもできません。したがって、コンストラクタ・インジェクション

public class OverviewPresenter implements OverviewContract.Events { 

    OverviewContract.View view; 

    @Inject 
    public OverviewPresenter(OverviewContract.View overviewView) { 
     view = overviewView; 
    } 
} 

を使用するようにプレゼンターを適応させるその後ビュー

@Module 
public class OverviewModule { 

    OverviewView mView; 

    OverviewModule(OverviewView view) { 
     mView = view; 
    } 

    @Provides 
    static OverviewView provideOverviewView() { 
     return mView; 
    } 
} 

を提供するために、モジュールを作成それからちょうどあなたのコンポーネントにモジュールを追加し、あなたは完了です。

@Component(modules = {OverviewModule.class}) 
public interface OverviewComponent { 

    void inject(OverviewActivity overviewActivity); 
} 

今ちょうどあなたのプレゼンターを注入し、あなたが行われている(このようなものを、タイプミスがあるかもしれません):

DaggerOverviewComponent.builder().overviewModule(new OverviewModule(this)).build() 
     .inject(this); 
+1

グレート答えについて多くを語っています。ありがとうございました。私はこの作業をするのがとてもうれしいです – Stephen

+0

プレゼンターに注入する必要がある各 'View'に対して専用' @ Module'sと '@Component'sを作成する必要がありますか?この場合、@Dakshは – Daksh

+0

です。あなたはいくつかのクラスを再利用する、より一般的な解決法を考え出すことができるかもしれません。 –

0

事は多分あなたがいるので、このためのモジュールを使用するべきではありませんされてビューとプレゼンターの間のリンクはライフサイクルに依存する必要があります。したがって、モジュールに応じて、私には過剰なものがあります。 アクティビティにプレゼンターを挿入する必要がありますが、アクティビティはpresenter.accept(this)やpresenter.takeView(this)などのメソッドを呼び出す必要があります。通常は次のようになります: - on Resume - > presenter.takeView(this) - on Pause - > presenter。dropView();

モスビーの枠組みについては非常に良いチュートリアルが http://hannesdorfmann.com/mosby/ で読み取ることができ、それは、MVPパターン

関連する問題