Dagger 2 的基本使用

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中的具体用法,敬请期待。。。

你可能感兴趣的:(IT)