2017-12-04 5 views
0

私はMVPアーキテクチャをDagger2と共に使用しています。コンストラクタインジェクションを使用してPresenterでContextを取得したい。MVPプレゼンターのコンテキストを注入する

My活動:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_appintroduction); 
     activityComponent().inject(this); 
     ButterKnife.bind(this); 
     skipall.bringToFront(); 
    } 

マイプレゼンター:

@ConfigPersistent 

    public class AppIntroPresenter extends BasePresenter<AppIntroMvpView> { 

     private final DataManager mDataManager; 
     private final Context ctx1; 


     @Inject 
     public AppIntroPresenter(DataManager dataManager,Context context) { 
      mDataManager = dataManager; 
      ctx1=context; 

     } 

     public void openCamView(Context ctx) { 

      ctx.startActivity(new Intent(ctx, CameraActivity.class)); 
     } 
    } 

私のアプリケーションコンポーネント:

My活動コンポーネント:

@PerActivity 
@Subcomponent(modules = ActivityModule.class) 
public interface ActivityComponent { 

    void inject(MainActivity mainActivity); 
    void inject(CameraActivity cameraActivity); 
    void inject(AppIntroActivity appIntroActivity); 

} 

私のアプリケーションモジュール:

@Module 
public class ApplicationModule { 
    protected final Application mApplication; 

    public ApplicationModule(Application application) { 
     mApplication = application; 
    } 

    @Provides 
    Application provideApplication() { 
     return mApplication; 
    } 

    @Provides 
    @ApplicationContext 
    Context provideContext() { 
     return mApplication; 
    } 

    @Provides 
    @Singleton 
    RibotsService provideRibotsService() { 
     return RibotsService.Creator.newRibotsService(); 
    } 

    @Provides 
    @Singleton 
    ClassService provideClassService() { 
     return ClassService.Creator.newClassService(); 
    } 

    @Provides 
    @Singleton 
    AnsweredQuestionService provideAnsweredQuestionService() { 
     return AnsweredQuestionService.Creator.newAnsweredQuestionService(); 
    } 



} 

My活動モジュール:

@Module 
public class ActivityModule { 

    private Activity mActivity; 

    public ActivityModule(Activity activity) { 
     mActivity = activity; 
    } 

    @Provides 
    Activity provideActivity() { 
     return mActivity; 
    } 

} 

コードを実行した後、私は取得エラー:私は、注射をコンストラクタにコンテキストを追加するとき、私は知っている

Error:(17, 8) error: [uk.co.ribot.androidboilerplate.injection.component.ActivityComponent.inject(uk.co.ribot.androidboilerplate.ui.AppIntro.AppIntroActivity)] android.content.Context cannot be provided without an @Provides-annotated method. 
android.content.Context is injected at 
uk.co.ribot.androidboilerplate.ui.AppIntro.AppIntroPresenter.<init>(…, context) 
uk.co.ribot.androidboilerplate.ui.AppIntro.AppIntroPresenter is injected at 
uk.co.ribot.androidboilerplate.ui.AppIntro.AppIntroActivity.mAppIntroPresenter 
uk.co.ribot.androidboilerplate.ui.AppIntro.AppIntroActivity is injected at 
uk.co.ribot.androidboilerplate.injection.component.ActivityComponent.inject(appIntroActivity) 

私のプレゼンターではこのエラーが出ますが、理由を理解できません。コンストラクタからコンテキストを削除した場合:

@Inject 
     public AppIntroPresenter(DataManager dataManager,Context context) { 
      mDataManager = dataManager; 
      ctx1=context; 

     } 

すべて正常に動作します。しかし、私は注射から文脈が必要です。これで私を助けてください?

+0

実際にプレゼンターに文脈を入れるのはなぜですか?プレゼンターはコンテキストに関連するアクションを実行するように指示する必要があります(例えば、トーストなどを表示します) – matrix

+0

高画質マトリックスですが、保存されたイメージのURIを取得します:photoApplication = getProperty ()+ ".provider"、file);したがって、プレゼンターにはアプリケーションのコンテキストが必要です。 –

+0

あなたが言うことから、あなたがウリにそれをインテントで使用させたいからです。したがって、あなたがIntentを使って何かをする必要があるときは、ビューaddDataToIntent(String filepath)を表示し、ビューでこれをContextで作成します。プレゼンターはアンドロイドからのインポートは必要ありません。将来のためにこれを念頭に置いてください。モデルとプレゼンターを利用して、ビューを変更してWebアプリケーションを作成するだけです。 – matrix

答えて

0

あなたのコンストラクタにメンバーがあるので、モジュールを作成し、@Provides@Singletonの注釈を付けられたインスタンスを作成する必要があります。ApplicationModuleと同じです。

+0

しかし、なぜPresenterコンストラクタでContextを取得できないのですか?データマネージャをコンストラクタで取得することができます。私のアプリケーションコンポーネントは、@ApplicationContext Context context();を持っています。だから私は私のコンストラクタでコンテキストを取得することができるはずですか? –

+0

私はあなたもAppモジュールを追加すべきだと思います: '@Subcomponent(modules = {ActivityModule.class、ApplicationModule.class})' –

+0

Florescuこんにちは、コンポーネントのサンプルコードと私が受け取るプレゼンターを追加できますか?文脈? –

関連する問題