3

新しいダガー 2 を試しています。実装するのは初めてですが、うまくいきません。私は概念を理解したと思います。ここでの例を理解しています

私の例のために少し変更した同じ構造をコピーしようとしています。

これは、必要なクラスを定義した Graph を拡張する AppComponent です。

@ApplicationScope
@Component(modules = {AppModule.class, DataModule.class})
public interface EFAppComponent extends EFGraph {

    /**
     * An initializer that creates the graph from an application.
     */
    public final static class Initializer {

        private Initializer() {
        } // No instances.

        public static EFAppComponent init(EFApp app) {
            return Dagger_EFAppComponent.builder()
                    .appModule(new AppModule(app))
                    .build();
        }
    }
}


public interface EFGraph {

    public void inject(EFApp app);

    public ImageLoader imageLoader();

    public EventBus eventBus();

}

次に、各モジュール内で、対応するクラスを提供しています。ここから、すべてがうまく機能し、Dagger が Dagger_EFAppComponent を正しく構築するように縫い合わせます。

次に、Application クラスで、コンストラクターを使用して初期化します

component = EFAppComponent.Initializer.init(this);
component.inject(this);

次に、私の目標は、アクティビティに ImageLoader と EventBus を挿入することです。そのために、ActivityComponent を作成します。

@ActivityScope
@Component(
        dependencies = EFAppComponent.class,
        modules = ActivityModule.class
)
public interface ActivityComponent {

    public void inject(BaseActivity activity);

}

次に、アクティビティから inject を呼び出します。

activityComponent = Dagger_ActivityComponent.builder()
                .eFAppComponent(component)
                .activityModule(new ActivityModule(this))
                .build();
activityComponent.inject(this);

したがって、inject メソッドの呼び出し後にアクティビティで @Inject EventBus eventBus を宣言したため、注入する必要があります。そうではありません。

したがって、私のアプリと例を段階的にデバッグおよび追跡した後、Dagger_ActivityComponent が正しくビルドされていないことに気付きました。

private final ActivityModule activityModule;
    private final EFAppComponent eFAppComponent;

    private Dagger_ActivityComponent(Builder builder) {  
        assert builder != null;
        this.activityModule = builder.activityModule;
        this.eFAppComponent = builder.eFAppComponent;
        initialize();
  }

初期化メソッドが空で、プロバイダーが変数として宣言されていません。

何か不足していますか?私は一日中それを機能させようとしてきましたが、成功していません。

助けに感謝します。

4

2 に答える 2

3

@Marcel、最近プロジェクトを Dagger 1.2 から 2.0 に移行しました。「application.inject(this);」の行に沿って何かを行うことで、抽象BaseActivityが依存関係を注入する同様のソリューションがありました。上記のコメントで述べたように、Dagger 2.0 では (現時点では) これは不可能です。

これを回避する方法の 1 つは、Application クラス自体の "inject" メソッドをオブジェクトの厳密な型に変更することでした。例えば..

class MyApp extends Application {
   ...
   public void inject(Object activity) {
    if (activity instanceof MainActivity) {
      mComponent.inject((MainActivity) activity);
    } else if (activity instanceof SubActivity) {
      mComponent.inject((SubActivity) activity);
    }
  }
}

これで、既存のクラスで何も変更する必要はありませんでした。

参考までに: これも行う@thomas-broyer によるBulletというプロジェクトがあります。

于 2015-05-06T20:53:12.653 に答える