注入实例时将参数传递给provider方法

时间:2017-10-02 09:45:15

标签: android dagger-2

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

@Module
public class MyModule {

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

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

3 个答案:

答案 0 :(得分:2)

您希望提供一个对象(String name)作为组件的参数,以便其他部分可以使用它。你基本上有2个选项可以这样做。

模块构造函数参数

使用模块参数是" classic"在介绍Component.Builder之前使用的方法。

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

@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); 
  }

}

直接使用该名称的第一个选项意味着它仅在 模块中可用。如果你想使用构造函数注入或使用限定的String,你必须将它添加到图形中,如图所示。

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

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

组件构建器

相同的概念,但不同的方法是使用组件构建器来实现相同的东西 - 将某些东西绑定到图形。

@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();

答案 1 :(得分:1)

  

我的问题是如何注入一个名字的学生实例   硬编码。

nameStudent的依赖项,此依赖关系将被解决。为此,您需要一个带注释的@Provid e方法,该方法返回String。由于类型通常由返回类型推断,因此在String的情况下,您还必须使用注释@Named

@Provides
@Named("Name")
public String provideName() {
    return "My name";
}

并改变你的方法,如

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

这样dagger2知道如何解决String以构建Student

答案 2 :(得分:1)

您可以创建"2020-07-01 UTC", "2020-07-01 UTC", "2020-07-01 UTC", "2020-07-01 UTC", "2020-07-01 UTC", "2020-06-01 UTC", "2020-06-01 UTC", "2020-06-01 UTC", "2020-06-01 UTC", "2020-06-01 UTC"工厂并注入它,而不是直接注入Student

Student

或Kotlin中的相同代码:

public class Student {
    public Student(String name, Knowledge knowledge) {
    }

    public static class Factory {
        private Knowledge knowledge;

        @Inject
        public Factory(Knowledge knowledge) {
            this.knowledge = knownledge;
        }

        public Student create(String name) {
            return new Student(name, knowledge);
        }
    }
}

这允许在class Student(name: String, knowledge: Knowledge) { class Factory @Inject constructor(private val knowledge: Knowledge) { fun create(name: String) = Student(name, knowledge) } } 实例上传递name参数,如下所示:

Student