看一下Android Architecture Components示例GithubBrowerSample的源代码,我不明白两次注入githubApp
的意义。
inject
方法不够吗?为什么它需要在同一句子中都使用它们?
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance Builder application(Application application);
AppComponent build();
}
void inject(GithubApp githubApp);
}
他们像这样使用它
public static void init(GithubApp githubApp) {
DaggerAppComponent.builder().application(githubApp)
.build().inject(githubApp);
答案 0 :(得分:2)
@BindsInstance
告诉Dagger,应该将应用程序注入依赖关系图中找到的任何@Inject Application
中。
第二个请求Dagger将依赖项注入到带有@Inject
注释的字段和方法中。这是依赖关系图的根。
从技术上讲,component方法可以随意调用多次,而builder方法只能调用一次。
答案 1 :(得分:2)
As Thomas Broyer described,您需要设置两个单独的方向:您希望Dagger图知道如何到达您的Application实例,并且您希望从依赖关系图中访问某些绑定。
Builder中的@BindsInstance
行为您传入的实例创建Application绑定。听起来像您了解这部分。
但是,创建组件后,大概想使用。假设您要从图中获取类Dep1,Dep2和Dep3的完全注入的实例。一种方法是在Component上创建获取实例的方法:
@Singleton @Component(/* ... */) interface AppComponent {
// [builder snipped out here]
fun getDep1(): Dep1
fun getDep2(): Dep2
fun getDep3(): Dep3
}
然后将它们称为创建应用的一部分。
var appComponent = DaggerAppComponent.builder().application(githubApp).build()
var dep1 = appComponent.getDep1()
var dep2 = appComponent.getDep2()
var dep3 = appComponent.getDep3()
// Use dep1, dep2, and dep3 here.
但是,您也可以创建一个单一参数方法,通常是称为void
的{{1}}方法。这将填充所有inject
注释字段,并在您传入的实例上调用所有@Inject
注释方法。如果GitHubApp具有@Inject
注释字段({{3} }),对@Inject
的调用使您可以跳过在组件上定义所有getter的操作。这样可以将上述所有代码减少为:
inject
...这就是您在演示中看到的内容。