Dagger 2.2组件构建器模块方法已被弃用。

84

我开始使用Dagger 2.2,但在Component Builder中的模块方法已经被弃用。

这是我的Application组件:

@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,我该如何初始化组件?

5个回答

189
您应该阅读为什么它已被弃用的说明。如果您使用像IntelliJ或Android Studio这样的IDE,则只需选择方法,然后在Windows上按Control+Q即可阅读包括弃用通知在内的Javadoc。 Javadoc的内容如下:

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

从链接中可以看到:

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

  • 如果模块中所有用于组件的方法都是静态方法,则Dagger根本不需要该模块的实例。Dagger可以直接调用静态方法而不需要模块。
  • 如果模块未为组件提供任何绑定,则构建图表不需要该模块的实例。

可以安全地说您可以忽略该弃用警告。这旨在通知您有未使用的方法和模块。只要您在子图中实际需要/使用了Application,模块就会被需要,并且弃用警告将消失。

81
扫描答案后,按下Command + Q键,Android Studio将关闭。开启大脑,稍等片刻后再次阅读答案。 - Bri6ko
4
顺便说一下,Ctrl + J是指快捷键组合。而Ctrl + Q则是恶作剧的一种尝试。 - StarWind0
4
@StarWind 没有恶意挑衅,这确实是 Windows 快捷方式 ;) - David Medenjak
1
@David Medenjak,回答缺失。你只是从源代码中复制/粘贴。没有关于如何解决它的内容。 - Sever
2
@Sever 没错,javadoc 已经说明了一切。这只是关于冗余部分的一些信息,并且如结尾所述,您可以忽略它。一旦您添加使用该模块的代码,它就会消失。 - David Medenjak

54

因为您的应用程序没有使用组件和模块,所以它显示为“已弃用”。

@Inject
SomeObjectFromModule mSomeObject

如果您的应用程序中未注入依赖项,则初始化组件没有任何作用,因此Dagger会寻找至少一个用途。

一旦您在要注入视图的任何类中添加这些行,然后进行清理构建和重建项目,您的废弃问题将得到解决。


6
应该选择这个作为采纳的答案。另外,在注入后别忘了“重建你的项目”。 - sokarcreative

6

我的Module没有@Provides方法或由Dagger提供的对象没有在应用程序中使用时会出现错误。
示例:如何删除已弃用的Module

Module

@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 class should check two things to save time“时能够考虑以下两点以节省时间:

1/ 确认module和component的dagger语法是否正确,并仔细检查您注入的位置。

2/ 必须在您要注入的位置上具有注入对象(注入注释及其对象),否则dagger编译器无法确定在哪里使用您的module,因此某些方法将被弃用。只需将至少一个module提供的内容注入到您的注入位置并重新编译代码,您将不再遇到这个问题 :)


1
如果在组件类中声明了void inject(AppCompactActivity activity);,你将会得到一个模块方法已弃用的警告。相反,你需要使用如下的紧密耦合:void inject(MainActivity activity);并重新构建项目,你将会发现,在模块类中没有废弃的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接