Retrofit、RxJava、MVP実装で私のプロジェクトでDagger 2を使用することを念頭に置いています。しかし、私はガイドを読んだり、ビデオを見たりして小さいものから始まり、それがどういう仕組みか理解していると思った時、私はそうではないように見えます。 Hereは私が理解しようとしているサンプルです。Dagger2フローの理解(サンプル提供)
モジュール:断片で
@Module
public class AppModule {
private App app;
public AppModule(App app) {
this.app = app;
}
@Provides @Singleton public SharedPreferences provideSharedPreferences() {
return PreferenceManager.getDefaultSharedPreferences(app);
}
@Provides @Singleton public HelloModel provideHelloModel(SchedulerProvider schedulerProvider,
HelloDiskCache helloDiskCache, HelloService helloService, Clock clock) {
return new HelloModel(schedulerProvider, helloDiskCache, helloService, clock);
}
@Provides public HelloDiskCache provideHelloDiskCache(SharedPreferences prefs) {
return new HelloDiskCache(prefs);
}
@Provides public HelloService provideHelloService() {
return new HelloService();
}
@Provides public SchedulerProvider provideSchedulerProvider() {
return SchedulerProvider.DEFAULT;
}
@Provides public Clock provideClock() {
return Clock.REAL;
}
@Provides @Nullable public LayoutInflaterFactory provideLayoutInflaterFactory() {
return null;
}
コンポーネント
@Component(
modules = AppModule.class
)
@Singleton
public interface AppComponent {
HelloModel getHelloModel();
HelloDiskCache getHelloDiskCache();
MainActivity inject(MainActivity activity);
HelloFragment inject(HelloFragment fragment);
}
、プレゼンターは(ここから来ている?)注入さ
@Inject HelloPresenter presenter;
そしてプレゼンターで、ありますコンストラクタインジェクション
@Inject HelloPresenter(HelloModel helloModel) {
this.model = helloModel;
}
だから、どのように来る我々はフラグメントでプレゼンターを注入することができ、そしてなぜ私たちはプレゼンターに注入することができますか?答えは非常に精巧である必要はありません私はそれがどこから来ているかを辿ることができないので、私はちょっと感じます。
私は、いくつかのチュートリアルの後に、注入が行われるすべての場所をコンポーネントに記述する必要があるという印象を受けましたが、これはApp.getAppComponent (getActivity())。たとえば、フラグメント内に(this)を挿入します。 コンポーネントにないクラスで@Injectを使用できる理由を理解していると思います。また、oncreateで注入物を実行しません。 – buddhabath
@buddhabathフィールドとコンストラクタに '@ Inject'アノテーションの使用法が混乱することがあります。 *フィールド*に '@Inject'を付けると、この依存関係を満たすために' App.getAppComponent(getActivity()).ins(this) 'を呼び出す必要があります。一方、コンストラクタに注釈を付けると、グラフ作成アクティビティでこのクラスが必要な場合にこのコンストラクタを使用できることをDaggerに伝えます。あなたがそのコンストラクタにアクセスすることができず、そのフィールドをコンストラクタparamsとして提供することができないので、 '... inject(this)'を 'Activity'にコールしない方法はありません。 – AndroidEx
'@ Inject'アノテートされたコンストラクタに関するもう一つの素晴らしい点は、そのパラメータがグラフから自動的に提供され、通常はそれらを使ってクラスフィールドに値を設定することです。この例では、コンポーネント内で 'provideHelloModel()'から 'HelloPresenter(HelloModel helloModel)'の 'helloModel'が提供されています。 – AndroidEx