私は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;
}
すべて正常に動作します。しかし、私は注射から文脈が必要です。これで私を助けてください?
実際にプレゼンターに文脈を入れるのはなぜですか?プレゼンターはコンテキストに関連するアクションを実行するように指示する必要があります(例えば、トーストなどを表示します) – matrix
高画質マトリックスですが、保存されたイメージのURIを取得します:photoApplication = getProperty ()+ ".provider"、file);したがって、プレゼンターにはアプリケーションのコンテキストが必要です。 –
あなたが言うことから、あなたがウリにそれをインテントで使用させたいからです。したがって、あなたがIntentを使って何かをする必要があるときは、ビューaddDataToIntent(String filepath)を表示し、ビューでこれをContextで作成します。プレゼンターはアンドロイドからのインポートは必要ありません。将来のためにこれを念頭に置いてください。モデルとプレゼンターを利用して、ビューを変更してWebアプリケーションを作成するだけです。 – matrix