google四件套之Dagger2。從入門到愛不釋手,之:Dagger2華麗使用在MVP框架中

前言

網上都說Dagger2是比較難上手的,我在看了大量資料和使用時也遇到了不少不懂或者模糊的知識點,並且大部分博客資料都比較古老。忽然有那麼一瞬間,忽然明白了因此然,故總結了4篇文章。話說在java中使用仍是很繁瑣的,不要怕帶你真正上手,並運用到咱們的Android項目中去。java

本次Dagger2講解總共分4篇:
一、Dagger2基礎知識及在Java中使用(1)
二、Dagger2基礎知識及在Java中使用(2)
三、Dagger2進階知識及在Android中使用
四、Dagger2華麗使用在MVP框架中android

經過上一篇Dagger2在Android中的使用,我相信代碼已經夠簡潔。並且使用比較靈活了。這篇咱們將介紹,怎麼在MVP項目裏用。會將以前Presenter以依賴註解的方式到Activity裏。並且會舉個小栗子。請注意這裏我會以我以前講的那篇MVP Demo的角度講解。不瞭解的能夠經過如下連接去看。絕對受益不淺!git


特別提醒:我這裏是以我以前的那篇MVP講解,恰好那篇只涉及到了RxJava + Retrofit + MVP。此次咱們加上Dagger2;

沒有了解的先去看這篇文章 RxJava + Retrofit + MVP(看完還不明白,吐槽我。適合初學者,VIP版MVP框架!!)


我會以以前那篇MVP的角度去講。

首先添加上Dagger2依賴github

//引入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的Fragmentapp


NeedInjectModules以下,我這裏再也不敘述這些標註的做用。上一篇都說的很清楚了框架

@Module
public abstract class NeedInjectModules {
    @ContributesAndroidInjector
    abstract POSTFragment injectPOSTFragment();
}
複製代碼


AppComponent以下ide

@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.post

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

    @Inject
    public PostPresenter(){

    }
    ...//省略部分代碼,便於理解
}
複製代碼


修改咱們的Application以下,繼承DaggerApplication,把DaggerAppComponent.Builder返回出去ui

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。this


經過上一篇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啊

相關文章
相關標籤/搜索