@Component.Builder
がダガー2でどのように機能するかを説明するthis偉大なチュートリアルを読んでいます。著者は良い仕事をしていますが、記事はまっすぐですが、まだ分かりにくいです:コンポーネントダガーの理解2 @ Component.Builder注釈
:
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
SharedPreferences getSharedPrefs();
}
モジュール:
@Module
public class AppModule {
Application application;
public AppModule(Application application) {
this.application = application;
}
@Provides
Application providesApplication() {
return application;
}
@Provides
@Singleton
public SharedPreferences providePreferences() {
return application.getSharedPreferences(DATA_STORE,
Context.MODE_PRIVATE);
}
}
ダガー2のデフォルトの実装は次のようになります
コンポーネントインスタンス化:
DaggerAppComponent appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this)) //this : application
.build();
記事によると、私たちは@Component.Builder
と@BindsInstance
アノテーションを使用してモジュールのコンストラクタに渡す引数を避けることによって、さらにこのコードを簡素化することができ、その後、コードは次のようになります。
成分:
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
SharedPreferences getSharedPrefs();
@Component.Builder
interface Builder {
AppComponent build();
@BindsInstance Builder application(Application application);
}
}
メートルodule:
@Module
public class AppModule {
@Provides
@Singleton
public SharedPreferences providePreferences(
Application application) {
return application.getSharedPreferences(
"store", Context.MODE_PRIVATE);
}
}
とコンポーネントのインスタンス化:
DaggerAppComponent appComponent = DaggerAppComponent.builder()
.application(this)
.build();
私はほとんど上記のコードがどのように機能するかを理解するが、ここで私は理解していない部分である:どのように我々はapplication(this)
にappModule(new AppModule(this))
から手に入れました私たちはコンポーネントをインスタンス化していますか?
私は質問がはっきりと感謝してくれたことを願っています。
を書く(ビルド);'ので、どのような ' appliction(これ)は 'のですか? –
'Component.Builder'インターフェースをチェックしてください! '@BindsInstance Builderアプリケーション(アプリケーションアプリケーション);' –
今私は参照してください:あなたは呼び出す必要があるコンポーネントにアプリケーションをバインドするメソッドを登録します! David Medenjakさん、本当にありがとう –