1、Dagger 2 的依赖库:
compile 'com.google.dagger:dagger:2.11'
annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
2、我们先根据MVP模式举个栗子,实现的功能就是完一个Activity中注入一个Presenter,然后通过Presenter来设置TextView的显示内容为user.name。(看不懂,没关系,耐心看完相信你就会了)
(1)创建一个user对象
public class User {
public String name;
public User(String name) {
this.name = name;
}
}
(2)创建一个Presenter
public class DaggerPresenter {
SplashActivity mSplashActivity;
User mUser;
public DaggerPresenter(SplashActivity splashActivity, User user) {
mSplashActivity = splashActivity;
mUser = user;
}
public void showUserName(){
mSplashActivity.showUserNmae(mUser.name);
}
}
现在有Presenter了,然后完SplashActivity中注入DaggerPresenter这个成员呢,先不着急,接着往下看。
第一步:创建Module
@Module
public class SplashModule {
private SplashActivity mSplashActivity;
public SplashModule(SplashActivity splashActivity) {
mSplashActivity = splashActivity;
}
@Provides
public SplashActivity provideActivity(){
return mSplashActivity;
}
@Provides
public User provideUser(){
return new User("csc this is my name");
}
@Provides
public DaggerPresenter provideDaggerPresenter(SplashActivity activity,User user){
return new DaggerPresenter(activity,user);
}
}
首先我们可以发现SplashModule这个类需要用 @Module 来注解的,然后SplashModule这个类对象中定义了一个构造函数,需要传入SplashActivity对象。在这里我们需要明确一点,Module的作用就是用来提供生成的依赖对象,比如我们需要注入DaggerPresenter,那么这个Module的作用就是需要生成一个DaggerPresenter的对象,让Dagger2注入到SplashActivity中。
所以我们这里需要编写一个函数 provideDaggerPresenter,这个函数可以从上面的代码看出,我们需要对这个函数使用 @Provides 注解,然后,我们这里需要传入两个参数,一个 DaggerActivity,一个 User 对象。那么,这两个参数从何而来呢?
细心的同学可能会发现,我上面的代码中还定义了两个函数,分别为provideUser 和 provideActivity,大家猜出点什么没有(嘿嘿),这里provideDaggerPresenter 的两个参数就是通过这两个函数来获取的。如果没有声明这两个函数的话,可能编译期间会报错哟。通过上述内容,各位同学应该明白了 Module 应该如何编写了吧。
编写 Module 有以下几个注意点:
类需要用 @Module 来标明注解。
这里有一点规则,用 @Provides 注解的函数需要以 provide 开头,然后后面接什么内容都可以,看自己喜欢,事实上,经过我的测试,我把 provideActivity() 改成 provideA() 同样是可以注入成功的,所以大家可以知道,这里是根据返回值类型来标识的,方法名并不重要,只需要保证以 provide 开头即可。
第二步:创建一个Component
@Component(modules = {SplashModule.class})
public interface SplashComponent {
void inject(SplashActivity splashActivity);
}
编写这个Component需要@Component注解来标识,同时声明了 modules == SplashModule.class 为第一步中编写的SplashModule,然后提供一个叫 inject()的方法用来在SplashActivity中注入。
第三步:选择 AndroidStudio -> Build -> Make Project ,然后AS会自动帮我们生成一个以Dagger开头的Component。比如我们上面的Module以SplashComponent命名,所以AS生成的就是DaggerSplashComponent。这样,我们就可以直接在SplashActivity中使用DaggerSplashComponent进行Presenter的注入了。
第四步:注入Activity。
public class SplashActivity extends AppCompatActivity {
private TextView mTxt;
@Inject
DaggerPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
mTxt = (TextView) findViewById(R.id.txt);
inject();
//注意这里Presenter没有进行实例化,而是直接使用了
mPresenter.showUserName();
}
private void inject() {
DaggerSplashComponent.builder()
.splashModule(new SplashModule(this))
.build()
.inject(this);
}
public void showUserNmae(String name) {
mTxt.setText(name);
}
}
AS已经生成的DaggerSplashComponent,在Activity的onCreate()方法中编写如下代码:
DaggerSplashComponent.builder()
.splashModule(new SplashModule(this))
.build()
.inject(this);
这样我们就完成在SplashActivity中对Presenter的注入,我们在SplashActivity发现,DaggerPresenter是没有实例化的,而是直接调用了。通过上面SplashActivity最终的效果就是TextView上显示了 “csc this is my name”。这就是Dagger2的小入门了。
接下来我会写一篇 Dagger的高级用法 和 项目MVP中的具体用法,敬请期待。。。