【问题标题】:Understanding the Dagger2 Flow (Sample provided)了解 Dagger2 流程(提供示例)
【发布时间】:2016-06-20 12:13:29
【问题描述】:

我正在尝试在我的项目中使用 Dagger 2 以及 Retrofit、RxJava、MVP 实现。然而,我是从阅读指南和观看视频开始的,就在我以为我理解它是如何工作的时候,似乎我没有。 Here 是我试图理解的示例。

模块:

@Module
public class AppModule {
  private App app;

  public AppModule(App app) {
    this.app = app;
  }

  @Provides @Singleton public SharedPreferences provideSharedPreferences() {
    return PreferenceManager.getDefaultSharedPreferences(app);
  }

  @Provides @Singleton public HelloModel provideHelloModel(SchedulerProvider schedulerProvider,
      HelloDiskCache helloDiskCache, HelloService helloService, Clock clock) {
    return new HelloModel(schedulerProvider, helloDiskCache, helloService, clock);
  }

  @Provides public HelloDiskCache provideHelloDiskCache(SharedPreferences prefs) {
    return new HelloDiskCache(prefs);
  }

  @Provides public HelloService provideHelloService() {
    return new HelloService();
  }

  @Provides public SchedulerProvider provideSchedulerProvider() {
    return SchedulerProvider.DEFAULT;
  }

  @Provides public Clock provideClock() {
    return Clock.REAL;
  }

  @Provides @Nullable public LayoutInflaterFactory provideLayoutInflaterFactory() {
      return null;
  }

组件

@Component(
    modules = AppModule.class
)
@Singleton
public interface AppComponent {
  HelloModel getHelloModel();
  HelloDiskCache getHelloDiskCache();
  MainActivity inject(MainActivity activity);
  HelloFragment inject(HelloFragment fragment);
}

在片段中,注入了presenter(这是从哪里来的?)

  @Inject HelloPresenter presenter;

并且在presenter中,有一个构造函数注入

  @Inject HelloPresenter(HelloModel helloModel) {
this.model = helloModel;

}

那么,为什么我们可以在 Fragment 中注入 Presenter,为什么我们可以在 Presenter 中注入呢?答案不必很详细,我只是觉得很愚蠢,因为我无法追踪它的来源。

【问题讨论】:

    标签: java android dependency-injection rx-java dagger-2


    【解决方案1】:

    @Inject-annotated 构造函数是 @Provides-annotated 方法的替代方法,用于在无需进行太多配置时的依赖项。

    由于HelloPresenter 有这样的构造函数,Dagger 会自动发现它并能够注入此依赖关系或使用它来构造和提供图中的其他对象。

    具有@Inject-annotated 构造函数的类本身可以使用范围注释进行注释(例如,@Singleton)。在这种情况下,只有具有匹配范围的组件才能看到它。

    一般来说,这种提供依赖的类型不太冗长,但并非总是可以使用它(例如,ActivitySharedPreferences)。在这种情况下,您必须使用 @Module@Provides 方法。

    【讨论】:

    • 嗯,我明白了,在阅读了一些教程之后,我的印象是所有发生注入的地方都需要在组件中提及,但这仅适用于您调用的地方,因为例如,片段中的 App.getAppComponent(getActivity()).inject(this) 。我认为我的麻烦是理解为什么我可以在不在组件中的类中使用@Inject,而不是在 oncreate 中执行注入操作。
    • @buddhabath @Inject 注解在字段和构造函数上的用法可能会有些混淆,它们是完全不同的。当你用@Inject 注释一个字段 时,你确实需要调用App.getAppComponent(getActivity()).inject(this) 来满足这个依赖。另一方面,当你注释一个构造函数时,你告诉 Dagger 如果它在其图形创建活动中需要这个类,它可以使用这个构造函数。没有办法不在 Activity 中调用 ...inject(this),因为您无法访问其构造函数,也无法将其字段作为构造函数参数提供。
    • @Inject 带注释的构造函数的另一个优点是它的参数是从图中自动提供的,您通常使用它们来填充您的类字段。在您的示例中,HelloPresenter(HelloModel helloModel) 中的 helloModel 是从组件内的 provideHelloModel() 提供的,因为这两个依赖项提供程序对组件都是可见的。
    • 这清除了一些,但假设我在演示者中添加了一个字段。 (我已经这样做了,我只是想知道它为什么会起作用)在模块中我创建了一个provideOmdbService,它返回一个retrofit.create(OmdbService.class),在演示器中我注入OmdbService 这是否因为Inject MainPresenter构造函数而起作用?
    • 这是我添加的内容的粘贴,pastebin.com/Mde6wKiX,基本上我只是在单击按钮时在 Presenter 中调用 refresh2
    【解决方案2】:

    您可以查看 Dagger2 与 MVP 架构一起使用的示例

    Dagger2 Android with MVP

    【讨论】:

      猜你喜欢
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      相关资源
      最近更新 更多