2017-04-04 27 views
1

私のAndroidアプリケーション用のサブコンポーネントを作成するには、このguideに従います。ここで私はLoginActivityに使用LoginComponentという名前の一つのサブコンポーネントを定義した:ダガー2:注入副成分を定義する

@Subcomponent(modules = LoginModule.class) 
public interface LoginComponent { 

    void inject(LoginActivity activity); 

    @Subcomponent.Builder 
    interface Builder { 
     Builder requestModule(LoginModule module); 
     LoginComponent build(); 
    } 
} 


@Module 
public class LoginModule { 
    @Provides 
    LoginManager provideLoginManager(LoginManagerImpl manager) { 
     return manager; 
    } 

    @Provides 
    LoginView provideLoginView(LoginViewImpl view) { 
     return view; 
    } 

    @Provides 
    LoginPresenter loginPresenter(LoginView view, LoginManager manager) { 
     return new LoginPresenterImpl(view, manager); 
    } 
} 

私は別のコンポーネント内のこのサブコンポーネントを定義します。ここでは

@Module(subcomponents = LoginComponent.class) 
public interface AppModule { 
} 

@Singleton 
@Component(modules = { 
     AppModule.class 
}) 
public interface AppComponent { 
} 

は私LoginActivityです:

public class LoginActivity extends AppCompatActivity { 

    @Inject LoginPresenter presenter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 
    } 
} 

私の質問は:

  1. 目的は@Subcomponent.Builderです。このコンポーネントのすべてのモジュールが@Subcomponent注釈で定義されているため、この点はわかりません。なぜ我々は再び複製する必要があります。
  2. 上記のアクティビティにどのようにLoginPresenterを注入できますか?

おかげ

答えて

3
  1. @Subcomponent.Builder@Component.Builderに文書と同じ規則に従います。あなたは短剣が自分自身を初期化することはできませんすべてのモジュールのためのセッターを持っている必要があります。 (モジュールにはコンストラクタパラメータまたは静的ファクトリメソッドがあるため、Daggerが独自のインスタンスを作成することはできません)

    ダガーはゼロ引数のコンストラクタを呼び出してLoginModuleを作成できるため、そのメソッドをBuilderから削除できます;それを再作成する必要はありません。また、LoginModuleのメソッドstaticを作成して、LoginModuleをインターフェイスまたは抽象クラスにすることもできます.Daggerはモジュールへの参照をまったく保持しないようにすることもできます。最後に、2つのクラス(たとえば@Provides B provideB(A a) { return a; })をバインドする単純な@Providesメソッドの場合は、@Bindsに切り替えることができます。これにより、生成されたコードがさらに高速になります。その時点で

    、あなたの@Subcomponent.Builderはサブコンポーネント固有Provider次のようになります。あなたはあなたのBuilderProvider<Builder>を注入し、その上にbuild()を呼び出すことによって、新しいサブコンポーネントのインスタンスを取得することができます。 Moduleインスタンスを提供する必要がないかぎり、Builderで他のメソッドを使用する必要はありません。

    Provider<LoginComponent>を単に注入することはできますが、実際にはそれを見たことがなく、自分で試したことはありません。

  2. LoginPresenterを挿入するには、AppComponentにアクセスして新しいLoginComponentを作成し、それを使用してアクティビティを注入する必要があります。しかし、これは難しいかもしれません。 LoginComponent.Builderを挿入するためのアクセス。

    代わりにdagger.androidを試したいのでない限り、AppComponentを呼び出して新しいLoginComponentを作成するメソッドを追加できます。

    // This way... 
    LoginComponent createLoginComponent(); 
    
    // or this way: 
    LoginComponent.Builder createLoginComponentBuilder(); 
    

    時々、あなたはダガー1に設立された命名規則である、plus()という名前の最初の方法が表示されます。最初の方法では@Subcomponentの作成を避けることもできます。ビルダーを追加するか、サブコンポーネントをAppModuleに追加することができますが、構造をそのまま残してAppModuleに後で追加することができます。

    終了するには、Activity.onCreateで、アクティビティにアプリケーションを取得し、AppComponentにアクセスして、自分自身を注入させることができます。

    ((YourApplication) getContext().getApplicationContext()) 
        .getApp() 
        .createLoginComponent() 
        .inject(this); 
    
関連する問題