Dagger的简单使用

作者: Peakmain | 来源:发表于2018-09-11 10:07 被阅读3次

简单介绍

定义什么的就不解释了,主要就两个字:解耦


image.png

注解

@Inject
通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样Dagger就会构造一个这样的类的实例并满足他们的依赖
@Module
moudles类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例时候,就知道从哪里去找到需要的依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,我们的app中可以有多个组成在一起的modules中)
@Provide
在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖
Component
Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是 连接着两个部分。Components可以提供所有定义了的类型的实例,比如,我们用@Component注解一个接口然后列出所有的

用法

这里可能很多人想说,定义谁不知道,上网搜一大堆,ok,别急。我们举例MVP中我们在view层会实现自己定义的view接口层和会拥有一个P层,一般我们都会这么实例

RecommendContract.Presenter mPresenter;
mPresenter = new RecommendPresenter(this);

RecommendPresenter在构造方法的时候需要对module进行初始化

    public RecommendPresenter(RecommendContract.View view, RecommendModel model) {
        this.mView = view;
        mModel = new RecommendModel();
    }

还有,我们访问网络的时候,我们会定义一个dialog,我们会这样去实例化

ProgressDialog mProgressDialog;
mProgressDialog = new ProgressDialog(getActivity());

我们这时候用Dagger进行隔离,不在进行这么多new的初始化操作,首先我们添加依赖,我的android版本是3.0,不需要添加classpath等

    //dagger2
    annotationProcessor 'com.google.dagger:dagger-compiler:2.0.2' //指定注解处理器
    implementation 'com.google.dagger:dagger:2.0.2'  //dagger公用api
    compileOnly 'org.glassfish:javax.annotation:10.0-b28'  //添加android缺失的部分javax注解

首先我们对我们解耦的对象添加@Inject属性

    @Inject
    ProgressDialog mProgressDialog;
    @Inject
     RecommendContract.Presenter mPresenter;

然后根据注解添加一个Module类,并添加一个注解@Module,完整代码

@Module
public class RemmendModule {
    private RecommendContract.View mView;

    public RemmendModule(RecommendContract.View view) {
        this.mView = view;
    }

    //参数RecommendContract.View Dagger会从其中拿相应类型RecommendContract.View的view并且添加注解的Provides,如果没有则报错
    @Provides
    public RecommendContract.Presenter providePeresenter(RecommendContract.View view,RecommendModel model) {
        return new RecommendPresenter(view,model);
    }
    @Provides
    public RecommendModel provideModel() {
        return new RecommendModel();
    }

    @Provides
    public RecommendContract.View provideView() {
        return mView;
    }

     @Provides
    public ProgressDialog provideProgressDialog(RecommendContract.View view) {
        return new ProgressDialog(((RecommendFragment) view).getActivity());
    }

    @Provides
    public RecomendAppAdatper provideAdapter() {

        return null;
    }
}

这里有人看不懂 public RecommendContract.Presenter providePeresenter(RecommendContract.View view,RecommendModel model) ;这里的构造函数并没有去new 和传过来,这样写会不会报错。这里,其实并不会,Dagger会去找构造函数中的参数RecommendContract.View返回类型一样的方法,并判断是否添加了@Provides注解。如果没有则报错,如果有会将值带过去

module和inject都有了,这时候我们就需要用Component类对这两者进行组合

@Component(modules = RemmendModule.class)
public interface RecommendComponent {
    void inject(RecommendFragment fragment);
}

原本presenter中module是new出来的,现在通过构造函数传过来


    public RecommendPresenter(RecommendContract.View view, RecommendModel model) {
        this.mView = view;
        mModel = model;
    }

重新build一下以后,在Fragment或Activity中使用

  DaggerRecommendComponent.builder().remmendModule(new RemmendModule(this)).build().inject(this);

相关文章

网友评论

    本文标题:Dagger的简单使用

    本文链接:https://www.haomeiwen.com/subject/udyygftx.html