不推荐使用Dagger 2.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,如何初始化组件?

Answers:


180

您应该阅读为什么不推荐使用的说明。 如果您使用的是IntelliJ或Android Studio之类的IDE,则只需选择方法,然后在Windows上按Control+Q即可阅读Javadoc(包括弃用通知)。

Javadoc读取:

@deprecated声明了此模块,但组件中未使用实例。此方法是禁止操作的。有关更多信息,请参见https://google.github.io/dagger/unused-modules

从此链接可以看到:

Dagger处理器生成组件时,它仅需要提供绑定请求的模块和组件依赖项实例。

  • 如果组件中使用的所有模块方法都是静态的,则Dagger完全不需要该模块的实例。Dagger可以直接调用静态方法而无需模块。
  • 如果模块不为Component提供任何绑定,则不需要该模块的实例来构造图形。

可以肯定地说,您可以忽略弃用。旨在通知您未使用的方法和模块。一旦您实际需要/Application在子图中的某个地方使用该模块,就将需要使用该模块,并且弃用警告将消失。


73
扫描答案,按命令+ Q,Android Studio关闭。打开大脑,回来,再次阅读答案。
Bri6ko '16

4
按下Ctrl +J。Ctrl + Q是尝试进行拖曳的尝试。
StarWind0

4
@StarWind无意拖钓,这Windows快捷方式;)
David Medenjak

2
真的不明白,为什么这个答案是最好的?
Sever的

2
@Sever确实,javadoc可以说明所有内容。这只是有关冗余部件的一些信息,最后,您可以忽略它。添加使用该模块的代码后,它将消失。
David Medenjak '17

49

它显示已弃用,因为您没有通过以下方式在应用程序中使用组件和模块

@Inject
SomeObjectFromModule mSomeObject

如果您没有在应用程序中注入依赖项,则无需初始化组件,因此匕首至少会寻找一种用法

一旦在任何类中添加了这些行,就想注入视图,然后清理构建并重新构建项目,您的弃用问题将得到解决。


5
它应该是公认的答案。此外,注入后不要忘记“重建项目”。
sokarcreative

4

Module没有@Provides方法或提供的对象Dagger未在应用程序中使用时显示错误。
删除不推荐使用的模块的示例

模组

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

活动

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

组件中的OR

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

    void inject(SecondActivity activity);

    Book getBookTest();
}

3

我对主机有同样的问题,我只希望每个人都对Generated component builder类不赞成使用,应该检查两件事以节省时间:

1 /模块,组件的正确匕首语法也要仔细检查注入的位置。

2 /必须将注入对象(注入注解及其对象)放置在要注入的位置,否则dagger编译器将看不到在何处使用模块,因此将不建议使用某些方法。只需将至少一个模块提供的注入到注入位置并重新编译代码,您将不再有该问题了:)


1

如果void inject(AppCompactActivity activity);在组件类中声明,将不赞成使用模块方法。而不是像下面那样使用紧密耦合void inject(MainActivity activity);并重建项目,您将看到,模块类中没有弃用方法

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.