阅读 2661

google四件套之Dagger2。从入门到爱不释手,之:Dagger2华丽使用在MVP框架中

前言

网上都说Dagger2是比较难上手的,我在看了大量资料和使用时也遇到了很多不懂或者模糊的知识点,而且大部分博客资料都比较古老。突然有那么一瞬间,突然明白了所以然,故总结了4篇文章。话说在java中使用还是很繁琐的,不要怕带你真正上手,并运用到我们的Android项目中去。

本次Dagger2讲解总共分4篇:
1、Dagger2基础知识及在Java中使用(1)
2、Dagger2基础知识及在Java中使用(2)
3、Dagger2进阶知识及在Android中使用
4、Dagger2华丽使用在MVP框架中

通过上一篇Dagger2在Android中的使用,我相信代码已经够简洁。而且使用比较灵活了。这篇我们将介绍,怎么在MVP项目里用。会将之前Presenter以依赖注解的方式到Activity里。而且会举个小栗子。请注意这里我会以我之前讲的那篇MVP Demo的角度讲解。不了解的可以通过以下链接去看。绝对受益匪浅!


特别提醒:我这里是以我之前的那篇MVP讲解,刚好那篇只涉及到了RxJava + Retrofit + MVP。这次我们加上Dagger2;

没有了解的先去看这篇文章 RxJava + Retrofit + MVP(看完还不明白,吐槽我。适合初学者,VIP版MVP框架!!)


我会以之前那篇MVP的角度去讲。

首先添加上Dagger2依赖

    //引入dagger.android库
    implementation 'com.google.dagger:dagger-android:2.24'
    // if you use the support libraries
    implementation 'com.google.dagger:dagger-android-support:2.24'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.24'
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.24'
复制代码


然后在MVP项目里新建daggerforandroid包,加上我们的AppComponent 以及注册的Module: NeedInjectModules。这里我们只把POSTFragment改成使用Dagger2的Fragment


NeedInjectModules如下,我这里不再叙述这些标注的作用。上一篇都说的很清楚了

@Module
public abstract class NeedInjectModules {
    @ContributesAndroidInjector
    abstract POSTFragment injectPOSTFragment();
}
复制代码


AppComponent如下

@Component(modules = {
        AndroidSupportInjectionModule.class,
        NeedInjectModules.class,
})

public interface AppComponent extends AndroidInjector<MyApplication> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        AppComponent build();
    }

}
复制代码


写到这里,我们需要初始化的数据是Presenter。,因为我是无参,所以直接用@Inject。如果你需要带参数,请注意使用Module。做完这部后,请记得Make Project.

public class PostPresenter extends BasePresenter<PostContract.View> implements PostContract.Prensenter {

    @Inject
    public PostPresenter(){

    }
    ...//省略部分代码,便于理解
}
复制代码


修改我们的Application如下,继承DaggerApplication,把DaggerAppComponent.Builder返回出去

public class MyApplication extends DaggerApplication {
    
    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerAppComponent.builder().application(this).build();
    }

}
复制代码

重点来了

之前我们使用RxJava + Retrofit + MVP的Demo,为了解决RxJava的内存泄漏, 使用了RxActivity,和RxFragment。


通过上一篇Dagger2在Android中使用,是需要继承DaggerActivity 和 DaggerFragment的。

这个时候怎么办呢。我们来看我们点开DaggerActivity的源码;

看完是不是有感觉了,我们新建一个BaseDaggerActivity 代码和之前的BaseActivity一模一样。唯一不同的是实现implements HasAndroidInjector 接口,并按源码里的去配置参数。

同时注意要给mPresenter加上@Inject标注,然后把我们之前页面new的方法cretaePresenter删除。搞定了

public abstract class BaseDaggerActivity<T extends BasePresenter> extends RxFragmentActivity implements BaseView, HasAndroidInjector {
    @Inject
    public T mPresenter;

    //public abstract T cretaePresenter();
    
    ...//省略部分代码,便于理解
}
复制代码


做完以上就搞定了,BaseDaggerFragment也是一样,如果需要注解的只要继承BaseDaggerActivity,不需要注解的话只要继承BaseActivity,即可

以上就是用Dagger2 依赖注入Presenter。

这里有个小例子,让你对Dagger2爱不释手

以上操作清楚后,我在Demo里的POSTFragment,用了依赖注入,代码如下:

public class POSTFragment extends BaseDaggerFragment<PostPresenter> implements PostContract.View {

    @Inject
    Woman woman;
    
    @OnClick(R.id.btn_dagger)
    public void daggerClick() {
        ToastUtils.showToast(woman.getSoul().getMoney() + "");
    }
    
}
复制代码

toast结果是 :100;


我们看看Woman的代码,注入了Soul

public class Woman {
    @Inject
    Soul soul;

    @Inject
    public Woman() {

    }

    public Soul getSoul() {
        return soul;
    }

    public void setSoul(Soul soul) {
        this.soul = soul;
    }
}
复制代码


我们看看Soul的代码,当然你可以用Module传值。

public class Soul {
    private int money = 100;
    @Inject
    public Soul() {

    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}

复制代码

这样写完Woman类,和Soul类。不用做别的操作,就能用了。当然如果用Module传值,要在AppComponent写上!!是不是很方便很方便

结束语:至此,我们4篇文章全部结束了。看完,是不是觉得Dagger2在Android中很好用。省去了所有new的过程,如果你再100个页面都使用了new 某个类。但是突然高需求,改了构造方法什么的,或者其他一些方法,是不是只要在Module里修改下就行了? 完美解耦

本文github Demo地址

花了老大劲,别误会,不是要钱。能不能留下个足迹star啊