私は Android アプリケーションの MVC パターンに従っていますが、この問題に数回遭遇し、回避する必要がありました。 私のアプリケーションがフィールドで @Inject アノテーションを使用して注入されたオブジェクトを作成できる場合、そのオブジェクトの @Inject フィールドは null であり、通常はクラッシュを引き起こします。 たとえば、ロジックとフローを処理するコントローラー クラスがあります。フラグメント/アクティビティはコントローラーにコールバックして、ユーザーの操作/状態の変化を通知します。ただし、挿入された Controller のインスタンスは通常 null です。
簡単な例を挙げて説明します。以下では、コントローラーに挿入されたアクティビティが作成され、それを使用してフラグメントを追加してフローを開始しています。その依存関係は処理されますが、コントローラーのアクティビティの依存関係は処理されません (つまり、null)。
ビジネス ロジックとフローを処理する単純なコントローラー クラス:
public class SomeController {
@Inject
SomeActivity someActivity;
private SomeComponent component;
private final Application app;
@Inject
public SomeController(Application app) {
this.app = app;
}
private void startActivity() {
component = Dagger_SomeComponent().builder()
.someModule(app)
.build();
someActivity.getFragmentManager().beginTransaction().
.add(R.id.content, SomeFragment.class, null)
.commit();
}
public void activityStarted() {
//callback when Activity is ready...
}
}
ユーザーの操作を処理し、コントローラーにコールバックしてビジネス ロジックを実行する単純なアクティビティ:
public class SomeActivity extends Activity {
@Inject
SomeController controller;
private void controllerCallback() {
//notify controller of something here...
}
}
オブジェクトをグラフに挿入するための単純なモジュール クラス:
@Module
public class SomeModule {
private Application app;
public SomeModule(Application app) {
this.app = app;
}
@Provides
@Singleton
SomeController provideSomeController( return new SomeController(app); )
@Provides
SomeActivity provideSomeActivity( return new SomeActivity();)
}
オブジェクトを消費するメソッドを提供する単純な Component クラス:
@Component
public interface SomeComponent {
void addController(SomeController controller);
SomeController controller();
SomeActivity activity();
}