Dagger2.2コンポーネントビルダーモジュールメソッドは非推奨


81

dagger 2.2の使用を開始しましたが、コンポーネントビルダーのモジュールメソッドは非推奨になりました。

これは私のアプリケーションコンポーネントです:

@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
    void inject(Application application);
}

そしてアプリケーションモジュール:

@Module
public class ApplicationModule {
    Application application;

    public ApplicationModule(Application application) {
        this.application = application;
    }

    @Provides
    @Singleton
    Application providesApplication() {
        return application;
    }
}

生成されたクラスは次のとおりです。

@Generated(
  value = "dagger.internal.codegen.ComponentProcessor",
  comments = "https://google.github.io/dagger"
)
public final class DaggerApplicationComponent implements ApplicationComponent {
  private DaggerApplicationComponent(Builder builder) {
    assert builder != null;
  }

  public static Builder builder() {
    return new Builder();
  }

  public static ApplicationComponent create() {
    return builder().build();
  }

  @Override
  public void inject(Application application) {
    MembersInjectors.<Application>noOp().injectMembers(application);
  }

  public static final class Builder {
    private Builder() {}

    public ApplicationComponent build() {
      return new DaggerApplicationComponent(this);
    }

    /**
     * @deprecated This module is declared, but an instance is not used in the component. This method is a no-op. For more, see https://google.github.io/dagger/unused-modules.
     */
    @Deprecated
    public Builder applicationModule(ApplicationModule applicationModule) {
      Preconditions.checkNotNull(applicationModule);
      return this;
    }
  }
}

ComponentBuilderを使用していない場合、コンポーネントを初期化するにはどうすればよいですか?

回答:


181

非推奨となる理由の説明を読む必要があります。 IntelliJやAndroidStudioなどのIDEを使用している場合は、メソッドを選択し、WindowsでControl+Qを押すだけで、非推奨の通知を含むJavadocを読むことができます。

Javadocには次のように書かれています。

@deprecatedこのモジュールは宣言されていますが、インスタンスはコンポーネントで使用されていません。この方法は何もしません。詳細については、https://google.github.io/dagger/unused-modulesを参照してください

そして、このリンクからあなたは見ることができます:

Daggerプロセッサがコンポーネントを生成する場合、バインディングの要求を提供するために明示的に必要なモジュールのインスタンスとコンポーネントの依存関係のみが必要です。

  • コンポーネントで使用されるモジュールのすべてのメソッドが静的である場合、Daggerはそのモジュールのインスタンスをまったく必要としません。Daggerは、モジュールなしで静的メソッドを直接呼び出すことができます。
  • モジュールがコンポーネントのバインディングを提供しない場合、グラフを作成するためにそのモジュールのインスタンスは必要ありません。

非推奨を無視することができると言っても過言ではありません。未使用のメソッドとモジュールを通知することを目的としています。Applicationサブグラフのどこかで実際に必要/使用するとすぐに、モジュールが必要になり、非推奨の警告は消えます。


75
回答をスキャンし、コマンド+ Qを押すと、AndroidStudioがシャットダウンします。脳をオンにして、戻ってきて、答えをもう一度読んでください。
Bri6ko

4
ちなみにCtrl + J。Ctrl + Qは、トローリングの試みです。
starWind0 2017

4
@StarWindトローリングは意図されていません。これWindowsのショートカットです;)
David Medenjak 2017

2
本当に理解できません、なぜこの答えが最善ですか?
2017年

2
@Severまさに、javadocがすべてを語っています。これは冗長な部分に関する情報であり、最後に述べたように、無視してかまいません。モジュールを使用するコードを追加すると、消えます。
David Medenjak 2017年

49

アプリケーションでコンポーネントとモジュールを使用していないため、非推奨と表示されます。

@Inject
SomeObjectFromModule mSomeObject

アプリケーションに依存性を注入していない場合は、コンポーネントを初期化する必要がないため、短剣で少なくとも1つの使用法を探してください

ビューを挿入するクラスにこれらの行を追加したら、プロジェクトをクリーンビルドして再構築すると、非推奨が解決されます。


5
それは受け入れられた答えでなければなりません。さらに、インジェクション後に「プロジェクトを再構築する」ことを忘れないでください。
sokarcreative

5

メソッドModuleがない場合、@Providesまたはによって提供されるオブジェクトがDaggerアプリで使用されていない場合、エラーが表示されます。
非推奨のモジュールを削除する例

モジュール

@Module
public class SecondActivityModule {
    @Provides
    Book provideBookTest() {
        return new Book();
    }
}

アクティビティ

public class SecondActivity extends AppCompatActivity {
    @Inject
    Book test;
    ...
}

またはコンポーネント内

@Component(modules = SecondModule.class)
public interface SecondComponent {

    void inject(SecondActivity activity);

    Book getBookTest();
}

3

私はホストで同じ問題を抱えており、生成されたコンポーネントビルダークラスの非推奨の問題をすべての人に伝えて、時間を節約するために2つのことを確認する必要があります。

1 /モジュールの短剣構文を修正し、コンポーネントは注入先も注意深くチェックします。

2 /インジェクションするインジェクションオブジェクト(インジェクトアノテーションとそのオブジェクト)が必要です。そうでない場合、daggerコンパイラはモジュールの使用場所を認識できないため、一部のメソッドは非推奨になります。少なくとも1つのモジュールの提供をインジェクション場所にインジェクトするだけです。コードを再コンパイルすると、その問題は発生しなくなります:)


1

void inject(AppCompactActivity activity);コンポーネントクラスで宣言すると、モジュールメソッドは非推奨になります。次のように密結合を使用しvoid inject(MainActivity activity);てプロジェクトを再構築する代わりに、モジュールクラスに非推奨のメソッドはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.