web-dev-qa-db-ja.com

非推奨のDagger 2.2コンポーネントビルダーモジュールメソッド

ダガー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を使用しない場合、コンポーネントを初期化するにはどうすればよいですか?

71
user1940676

の説明を読む必要があります。なぜ廃止予定です。 IntelliJやIDE St​​udioのようなAndroidを使用している場合は、メソッドを選択してヒットするだけです Control + Q Windowsで非推奨の通知を含むJavadocを読む

Javadocの読み取り:

@deprecatedこのモジュールは宣言されていますが、コンポーネントでインスタンスが使用されていません。このメソッドはノーオペレーションです。詳細については、 https://google.github.io/dagger/unused-modules を参照してください。

また、このリンクから次を確認できます。

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

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

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

161
David Medenjak

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

@Inject
SomeObjectFromModule mSomeObject

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

ビューを挿入したいクラスにこれらの行を追加してから、プロジェクトをきれいにビルドして再ビルドすると、廃止予定が解決されます

41
saksham

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();
}
4
Phan Van Linh

私はホストにも同じ問題がありますが、時間を節約するために、生成されたコンポーネントビルダークラスの2つのことを確認する必要がある問題を誰もが非難したいだけです:

1 /モジュールの短剣構文を修正し、コンポーネントは注入する場所も慎重にチェックします。

2 /注入したい場所に注入オブジェクト(注釈とそのオブジェクトを挿入)が必要ですコードを再コンパイルすると、その問題はもうありません:)

3
danhnn.uit