注释处理器“com.google.dagger:dagger-compiler:2.11-rc2”
编译“com.google.dagger:dagger-android-support:2.11-rc2”
工程包结构
Application 类使用AppComponent 来构造图形。 AppComponent 类在顶部用@Component 进行注释。当使用该模块构造AppComponent 时,您将获得一个包含所有必需实例对象的图表。例如,如果应用程序模块提供ApiService,则在构造拥有该应用程序模块的组件时,您将获得一个ApiService 实例对象。
如果你想向dagger graph中添加一个activity,以便可以直接从父组件获取所需的实例,只需在该activity上添加@Subcomponent注解即可。在此示例中,DetailActivityComponent 和MainActivityComponent 类均使用@Subcomponent 进行注释。最后,还有必要的步骤。有关相关子组件的信息必须传递给父组件,以便每个根组件都知道其所有子组件。
别担心,我们稍后会解释@Subcomponent、@Component和DispatchActivity。以下是@Component 和@SubComponent 的概述。
@Component and @Component.Builder
@Component(模块={
AndroidInjectionModule.class,
应用程序模块.类,
活动构建器.类})
公共接口AppComponent {
@组件.builder
界面构建器{
@BindsInstance 构建器应用程序(application应用程序);
AppComponent 构建();
}
无效注入(AndroidSampleApp应用程序);
}
**@Component:**组件是一个图。构建组件时,它使用模块来提供注入的实例对象。
**@Component.Builder:** 您可能需要将一些实例对象绑定到组件。在这种情况下,您可以创建一个用@Component.Builder 注解的接口,并将您想要的任何内容添加到构建器方法中。此示例将应用程序添加到AppComponent。
注意:当您为组件创建构建器时,构建器接口必须具有builder() 方法,该方法的返回类型为您创建的组件。
注入 AppComponent
DaggerApp 组件
。建造者()
.应用程序(这个)
。建造()
.注入(这个);
从上面的代码可以看到,我们将应用程序实例绑定到了dagger graph。
我相信您已经对@Component.Builder和@Component有了一定的了解。我想在这里谈谈项目的结构。
Component/Module 结构
使用Dagger 时,您可以将应用程序分为三层。
应用程序组件Activity 组件Fragment 组件
Application Component
@Component(模块={
AndroidInjectionModule.class,
应用程序模块.类,
活动构建器.类})
公共接口AppComponent {
@组件.builder
界面构建器{
@BindsInstance 构建器应用程序(application应用程序);
AppComponent 构建();
}
无效注入(AndroidSamp
leApp应用程序);
}
每个Android 应用程序都有一个Application 类,因此我们也有一个Application 组件。该组件代表提供给应用层的实例(OkHttp、Database、SharedPrefs 等)。该组件是匕首图的根。在此应用程序中,应用程序组件提供三个模块。
AndroidInjectionModule:这个类不是我们创建的。这是Dagger 2.10中的内部类,通过特定模块提供活动和片段。 ActivityBuilder:我们创建的模块。该模块将所有活动映射放置在这里。 Dagger 可以捕获编译期间的所有活动。该应用程序有两个活动:MainActivity 和DetailActivity,因此我们将这两个活动放在这里。
@模块
公共抽象类ActivityBuilder {
@绑定
@IntoMap
@ActivityKey(MainActivity.class)
Abstract AndroidInjector.Factory 扩展Activity binActivity(MainActivityComponent.Builder builder);
@绑定
@IntoMap
@ActivityKey(DetailActivity.class)
Abstract AndroidInjector.Factory 扩展Activity binDetailActivity(DetailActivityComponent.Builder builder);
}
AppModule:这提供了改造、okhttp、持久性数据库和SharedPrefs。有一个非常重要的细节。必须将子组件添加到AppModule 中,以便dagger graph 可以识别它们。
@模块(子组件={
MainActivityComponent.class,
DetailActivityComponent.class})
公共类应用程序模块{
@假如
@单例
上下文ProvideContext(应用程序应用程序) {
返回申请表。
}
}
Activity Components
有两个活动:MainActivity 和DetailActivity。这些都有自己的模块和组件,但也是子组件,如上面AppModule 中定义的那样。
MainActivityComponent:该组件是连接MainActivityModule的桥梁,但一个重要的区别是您不需要向该组件添加inject()和build()方法。 MainActivityComponent 集成了父类中的这些方法。 AndroidInjector 类是dagger-android 框架中的一个新类。
@SubComponent(模块=MainActivityModule.class)
公共接口MainActivityComponent 扩展AndroidInjector{
@子组件.builder
抽象类Builder 扩展了AndroidInjector.Builder{}
}
MainActivityModule:该模块提供MainActivity相关的实例对象,例如MainActivityPresenter。您是否注意到ProvideMainView() 方法将MainActivity 作为参数?是的,它使用MainActivityComponent 来创建所需的对象。因此,Dagger 将活动添加到图表中并使其可供使用。
@模块
公共类MainActivityModule {
@假如
MainView ProvideMainView(MainActivity mainActivity){
返回主活动。
}
@假如
MainPresenter ProvideMainPresenter(MainView mainView, ApiService apiService){
返回一个新的MainPresenterImpl(mainView, apiService)。
}
}
类似地,就像我们创建MainActivityComponent和MainActivityModule一样,我们可以创建DetailActivityComponent和DetailActivityModule,从而跳过某些步骤。
Fragment Components
如果DetailActivity中有两个Fragment该怎么办呢?其实这个想起来并不难。首先,让我们考虑一下活动和应用程序之间的关系。应用程序通过映射模块(本例中为ActiveBuilder)了解所有活动,并将所有活动作为子组件添加到AppModule 中。
Activity 和Fragment 也是如此。首先创建一个FragmentBuilder模块并将其添加到DetailActivityComponent中。
现在,您可以创建DetailFragmentComponent 和DetailFragmentModule,就像之前创建MainActivityComponent 和MainActivityModule 一样。
DispatchingAndroidInjector
您需要做的最后一件事是将其注入注射器。注射器有什么作用?我想用简单的代码来解释它。
公共类AndroidSampleApp 扩展Applicationimplementes HasActivityInjector {
@注入
AndroidInjector 活动调度AndroidInjector 调度;
@覆盖
公共无效onCreate() {
super.onCreate();
//简化
}
@覆盖
公共DispatchingAndroidInjector ActivityInjector() {
返回activityDispatchingAndroidInjector。
}
}
由于我们的应用程序中有许多活动,因此我们实现HasActivityInjector 接口。具有多个片段的活动怎么样?这是否意味着您必须在活动中实现HasFragmentInjector 接口?是的,这就是我的意思!
公共类DetailActivity 扩展AppCompatActivityimplements HasSupportFragmentInjector {
@注入
AndroidInjector 片段dispatchAndroidInjector;
//简化
@覆盖
公共AndroidInjector supportFragmentInjector() {
返回片段调度AndroidInjector。
}
}
如果您没有子片段并且不需要向片段中注入任何内容,则不需要实现HasSupportFragmentInjector 接口。然而,在这个例子中,我们需要在DetailActivity中创建一个DetailFragment。
AndroidInjection.inject(this)
你为什么做这个?这是因为Activity和Fragment都不应该被注入,但是它们应该如何注入呢?
活动内部:
@覆盖
protected void onCreate(bundle 保存实例状态) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
片段内部:
@覆盖
公共无效onAttach(上下文上下文){
**AndroidSupportInjection.inject(this);
** super.onAttach(context);
}
没错,恭喜你。所有工作都已完成。
最后
多年来,编辑了解到,大多数入门级和中级Android工程师想要提高自己,往往必须自己探索和成长,这是不系统的、短暂的,我了解到这并没有帮助。
因此,我们收集整理了《2024年Android移动开发全套学习资料》册。最初的目的也很简单。换句话说,我们想帮助那些想学习、提高自己,但不知道从哪里开始的朋友。
由于文件较多,这里仅展示部分目录截图。这套完整的目录包括对领先制造商的采访、学习笔记、源代码讲义、实践项目、概述路线、电子书和教学视频。它将持续更新。
一个人可以走得快,但一群人可以走得更远。无论是IT行业的资深人士还是对IT行业感兴趣的新人。
欢迎任何人加入我们的圈子(技术交流、学习资源、职场投诉、大公司内部推荐、面试指导),让我们一起学习、成长!
如果您需要此信息,请从第 栏中获取。
27863)]
[外部链接图像正在传输.(img-Mg4Clf9S-1719273127863)]
由于文件较多,这里仅展示部分目录截图。这套完整的目录包括对领先制造商的采访、学习笔记、源代码讲义、实践项目、概述路线、电子书和教学视频。它将持续更新。
一个人可以走得快,但一群人可以走得更远。无论是IT行业的资深人士还是对IT行业感兴趣的新人。
欢迎任何人加入我们的圈子(技术交流、学习资源、职场投诉、大公司内部推荐、面试指导),让我们一起学习、成长!
如果您需要此信息,请从第 栏中获取。
#【翻译】以上有关New Android Injector: Dagger 2(1)的相关内容摘自网络,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92167.html