[译] 全新 Android 注入器:Dagger 2(一)(注入器手机版)

[译] 全新 Android 注入器:Dagger 2(一)annotationProcessor ‘com.google.dagger:dagger-compiler:2.11-rc2’ compile ‘com.google.dagge

注释处理器“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

Like (0)
CSDN的头像CSDN
Previous 2024年6月25日
Next 2024年6月25日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注