不推荐使用Dagger 2.2组件构建器模块方法

use*_*676 73 android dagger-2

我开始使用dagger 2.2并且不推荐使用"组件"构建器中的模块方法.

这是我的应用程序组件:

@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
    void inject(Application application);
}
Run Code Online (Sandbox Code Playgroud)

和应用程序模块:

@Module
public class ApplicationModule {
    Application application;

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

    @Provides
    @Singleton
    Application providesApplication() {
        return application;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是生成的类:

@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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果没有使用ComponentBuilder,如何初始化组件?

Dav*_*jak 165

您应该阅读不推荐使用原因的说明. 如果您使用的是IntelliJ或Android Studio等IDE,则只需选择方法并按Windows上的Control+ Q即可阅读包含弃用通知的Javadoc.

Javadoc读到:

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

从这个链接你可以看到:

当Dagger处理器生成组件时,它只需要明确需要的模块和组件依赖项实例来提供绑定请求.

  • 如果组件中使用的所有模块方法都是静态的,则Dagger根本不需要该模块的实例.Dagger可以在没有模块的情况下直接调用静态方法.
  • 如果模块没有为Component提供绑定,则构造图形不需要该模块的实例.

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

  • 扫描答案,点击命令+ Q,Android Studio关闭.打开大脑,回来,再次阅读答案. (63认同)
  • 顺便提一下Ctrl + J. Ctrl + Q是一次尝试拖钓. (4认同)
  • @StarWind没有拖曳的意图,这个_是Windows快捷方式;) (4认同)
  • @Sever确切地说,javadoc说明了一切.它只是关于冗余部分的一些信息,如最后所述,您可以忽略它.添加使用该模块的代码后,它将消失. (2认同)

sak*_*ham 43

它显示已弃用,因为您没有在应用程序中使用组件和模块

@Inject
SomeObjectFromModule mSomeObject
Run Code Online (Sandbox Code Playgroud)

如果您没有在应用程序中注入依赖项,则不会使用初始化组件,因此dagger至少要查找一次使用

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

  • 这应该是公认的答案.此外,注意后不要忘记"重建你的项目". (5认同)

Pha*_*inh 6

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

模块

@Module
public class SecondActivityModule {
    @Provides
    Book provideBookTest() {
        return new Book();
    }
}
Run Code Online (Sandbox Code Playgroud)

活动

public class SecondActivity extends AppCompatActivity {
    @Inject
    Book test;
    ...
}
Run Code Online (Sandbox Code Playgroud)

在组件中

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

    void inject(SecondActivity activity);

    Book getBookTest();
}
Run Code Online (Sandbox Code Playgroud)