写作背景
这几天在学习Dagger、MVP、Agera,这里所说的Dagger即Google接手的Dagger,也被称作Dagger 2。跟着demo与一些技术博客学习,发现对于一个未曾使用过类似框架的人来说上手很困难,因此撰 初学Dagger 系列学习笔记,以一名初学者的视角来分享自己的学习经验,希望让大家上手更顺利。本文集将随Winter的学习进度更新。
Hello Dagger
环境配置
我比较喜欢从功能入手来了解一个框架,所以让我们从Hello Dagger开始吧。
如上图,新建一个项目 Hello Dagger, 选择 Empty Activity 模版。项目创建好后,在build.gradle(Project: HelloDagger)文件中的dependencies内添加
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
在build.gradle(Module: app)文件中最外层的上方添加
apply plugin: 'com.neenbedankt.android-apt'
继续在该文件内的dependencies内添加
// apt command comes from the android-apt plugin
apt 'com.google.dagger:dagger-compiler:2.2'
compile 'com.google.dagger:dagger:2.2'
provided 'javax.annotation:jsr250-api:1.0'
这样,Dagger的环境便配置好了,下面让我们来开心地实现Hello Dagger.
代码实现
官方的例子有点复杂,我表示看起来很吃力,所以,这里我们实现一个最简单的Dagger demo就好了: 点击按钮,获取Dagger注解的一个String,并显示Toast。
首先,在activity_main布局中添加一个按钮, 用于触发事件,如下:
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Say hello"/>
然后创建建一个类文件 AppModule
@Module
public class AppModule {
@Provides
String provideHello() {
return "hello dagger";
}
@Provides
@Named("hi")
String provideHi() {
return "hi dagger";
}
}
@Module : 依赖的提供者,通俗的说就是该类负责提供数据内容;
@Provides : 负责提供值,被注解的方法提供返回参数类型的数据,如果同一个module中多个provides返回参数类型一致,那么必须加@Named("xxx")以进行区分,其实xxx才是该provides的真正名字,方法名没有什么意义。
再来创建一个接口文件 AppComponent
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity activity);
}
@Component :依赖的注入者,AppComponent在编译时会自动生成 DaggerAppComponent文件,因为modules = {AppModule.class},所以DaggerAppComponent可以访问AppModule.class内的内容,接口内有方法 void inject(MainActivity activity) ,所以该接口也可以访问MainActivity,因而可以成为MainActivity与AppModule.class之间的桥梁。
先编译一下,使AppComponent生成DaggerAppComponent文件,接着在MainActivity的onCreate()方法内添加以下代码
DaggerAppComponent.builder()
.appModule(new AppModule())
.build()
.inject(this);
这样一来,AppModule内的内容便注入到MainActivity中了,现在我们可以在MainActivity中访问AppModule里面的内容了,访问方式如下,在MainActivity中添加全局变量
@Inject
String hello;
@Inject
@Named("hi")
String hi;
@Inject :需要注入依赖的地方,Dagger 会构造一个该类的实例并满足它所需要的依赖,通俗地说就是该变量被初始化为AppModule中@Provides且同类型同名(@Named相同)的方法的返回值了。
感觉还是挺神奇,这里为了方便把注入写在MainActivity中了,如果在Application中注入,那么仅需初始化一次,该Application下的所有类都能访问了。
好了,为按钮添加点击事件,并showToast看看。
Demo地址如下:
https://github.com/XunMengWinter/HelloDagger