android - 注入(inject)实例时将参数传递给提供者方法

标签 android dagger-2

我是 Dagger 2 的新手。我创建了一个模块,它有一个带有一个字符串参数的提供者方法:

@Module
public class MyModule {

  @Provides
  Student provideStudent(String name) {
    return new Student(name); 
  }
}

注入(inject)student时如何传递参数name@Inject Student 学生?但是我在哪里/如何传递 name 呢?

最佳答案

您想提供一个对象(字符串名称)作为组件的参数,以便其他部分可以使用它。您基本上有 2 个选择。

模块构造函数参数

使用模块参数是您在引入 Component.Builder 之前使用的“经典”方法。

您所做的就是将您需要的内容添加到您的模块构造函数中,并从模​​ block 中提供它。

@Module
public class MyModule {

  private String name;

  MyModule(String name) {
    this.name = name;
  }

  // -----------------------------------------------
  // you could obviously just use the field directly
  @Provides
  Student provideStudent() {
    return new Student(name); 
  }


  // ---------------------------------------------------------------------
  // alternatively you'd add a Qualifier and add the argument to the graph
  @Provides
  @Named("name")
  String provideName() {
    return name; 
  }

  // then you can use it...
  @Provides
  Student provideStudent(@Named("name") String name) {
    return new Student(name); 
  }

}

第一个直接使用名称的选项意味着它仅在那个 模块中可用。如果您想使用构造函数注入(inject)或使用限定字符串,您必须将其添加到图中,如第二个所示。

无论使用哪种方法,您都必须手动将模块添加到组件,因为模块不再使用默认构造函数。这也是您现在提供论点的地方。

DaggerMyComponent.builder()
        .myModule(new MyModule("some name"))
        .build();

组件生成器

相同的概念但不同的方法是使用组件构建器来实现相同的事情——将某些东西绑定(bind)到图形。

@Component(modules = MyModule.class)
interface MyComponent {

    @Component.Builder
    interface Builder {

        @BindsInstance Builder name(@Named("name") String name);

        MyComponent build();
    }
}

@Module
class MyModule {

    @Provides
    Student provideStudent(@Named("name") String name) {
        return new Student(name);
    }

}

在这里,您还只需将一个对象添加到可以使用的图形中。在这里,您也必须将其添加到组件构建器中

DaggerMyComponent.builder()
        .name("some name")
        .build();

关于android - 注入(inject)实例时将参数传递给提供者方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46523145/

相关文章:

android - 从库中删除armeabi-v7a文件夹后,静态初始化失败

android - 应用程序语言更改后的Firebase远程配置即时本地化

java - 如何在拖动事件中选择多个复选框

java - 如何使用 Dagger2 将依赖项注入(inject)任何类型的对象?

java - Android 仪器测试中的 Dagger 2 注入(inject)

android - Dagger 2 注入(inject)器并使用 IntKey 绑定(bind) IntoMap

Android解码gif问题

android - Dagger : Can't provide Map<java. lang.Class<? extends android.arch.lifecycle.ViewModel> 没有 @Provides-annotated 方法

java - Java 代码中的 Kotlin List 与 java.util.List 泛型类型

android - 使用 Robolectric 测试 DialogFragments