组件化架构Dagger2无缝连接开发

前言

可以说已经一个多月没有更新了,mdzz这个月一直在赶项目节奏,可算是度过了这个阶段。也不能说这个月没有收获,新项目中又总结了不少经验,这次就来分享一下所感所得吧,记得之前写过一篇文章说的是组件化开发详解这篇文章可能与他息息相关。只不过是把Dagger引入了组件化开发项目中,之前那篇文章的重点是如何搭建一个组件化架构,方便团队开发配合。这篇文章的重点是把dagger引入组件化开发架构中,之前搭建组件化开发也没想到用Dagger引入项目,因为坑不是一般的多,各种错误,各种bug,让你头疼。这篇文章会把这些问题一一阐述,达到无缝连接

坑列表

大部分都是放置位置的问题。这样会让你减少很多module里面的代码

  1. 组件化架构Dagger如何配置
  2. Module放置位置
  3. XXXComponent位置如何放置,不会出现找不到Module
  4. Base App/Activity/Fragment 如何封装

各个Module的Gradle Dagger配置

先把简单的架构图放上面 方便下面一一叙述


从上图可以看出每个module都会依赖于最下层的Library

1.那么我们先说在Library的gradle中如何配置吧

dependencies {
  compile 'com.google.dagger:dagger:2.x'
  annotationProcessor 'com.google.dagger:dagger-compiler:2.x'
}

2.那么接下来我们来看看Module中如何配置Gradle文件呢!

dependencies {
  annotationProcessor 'com.google.dagger:dagger-compiler:2.x'
}

看到上面代码是不是很惊讶,为什么在上层module中为什么还要重复依赖呢,出现了同样的配置。

 annotationProcessor 'com.google.dagger:dagger-compiler:2.x'

大家应该都明白这行代码的主要功能是用于生成代码的。底层library里面不是已经有了吗?为什么在上层module中还出现呢?这是一个坑。下面我会一一解释

Dagger Module放置位置

其实dagger 中的Module的放置位置很重要,因为module 是用于component注入到各个Activity里面的,之前的mv*这些架构Di这些东西都是放在Application module里面的,但是我们既然是组件化开发,肯定要知道我们的初衷,我们的BaseLibrary到底是干嘛的。给上层module提供各种工具各种方便,让各个module开发互相不干扰。

那么当然是把各种module放在最底层的library中的了如ActivityModule, FragmentModule,AppModule 这些我只是简单的举例,可能还有很多Module,其实这里说到module 可能也会明白上面的为什么在最底层library中也添加代码生成

 annotationProcessor 'com.google.dagger:dagger-compiler:2.x'

为了生成相应的module代码。提供上面component使用。

XXXComponent位置如何放置,不会出现找不到Module

这个问题也是我在开发中出现的,由于之前只是在mv*架构中使用Dagger 在组件化架构中开发知道坑多,没用Dagger,那么我们来看看如何放置我们的Activity/Fragment/App Component等等这些位置。这里我只举例而我们的ActivityComponent和AppComponent的放置位置。

1.AppComponent如何放置,当然是放在我们的BaseLibrary中了,因为是App全局都需要用的,所以我们这个可以写在我们最底层的Library中,然后上层module都可以用到。其实之前我是每个Module都放的,发现这样写真是很多冗余的代码,没有脱离mvp那
个结构 导致的。

2.ActivityComponent如何放置呢?可能会比较麻烦因为每个上层Module用到的都要放置一个对应的ActivityComponent

@PerActivity
@Component(dependencies = BaseAppComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
    Activity getActivity();
    void inject(VoiceActivity mainActivity);
ity);
}

从上面代码也可以看出 我们为什么每个组件Module为什么都放置一个ActivityComponent,因为如果你放置在底层Library中,你根本不知道你的哪个activity要用到,而且library也是拿不到上层Module里面的任何东西 底层library只是一个供给者 而非索取者。

但是我们的AppComponent不需要知道我们需要哪些东西,我们只是负责提供东西。

Base App/Activity/Fragment 如何封装

如果你的项目按照上面的配置,这时你已经绕过了很多坑的地方

说道封装Base 这时候需要提到一个问题就是之前那一篇文章说道了一个问题 module与Application之间调用的问题 我也提供了解决方案,就是在底层Library中写个BaseApplication来供上层调用。

那么我们回归正题,这里只说App 和 Activity的Base封装

  1. 底层Library中的BaseApp如何封装呢?看代码
public abstract class BaseApp extends Application {
    protected static BaseApp app;
    public static BaseApp getInstance() {
        return app;
    }
    
    protected abstract void initSDK();

    public BaseAppComponent getAppComponent() {
        return  DaggerBaseAppComponent.builder()
                .appModule(new AppModule(this))
                .retrofitModule(new RetrofitModule(this))
                .build();
    }

}

这时候就体现了上面说道的Component和Module放置位置的重要性。 我们的module 和APPComponent都是放在底层Library

  1. BaseActivity的封装。这个我感觉比较灵活,自己根据自己的项目来进行封装,怎么样都行。给大家看一下我的代码,我是这样的
public abstract class BaseMvpActivity<T extends BasePresenter> extends AppCompatActivity implements BaseView {
    @Inject
    protected T mPresenter;
    public static Activity mContext;
    private Unbinder mUnBinder;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(initLayout());
        mContext = this;
        mUnBinder = ButterKnife.bind(this);
        initInject();
        if (mPresenter != null) {
            mPresenter.attachView(this);
        }
        initData();
    }


    protected abstract void initInject();


    protected ActivityComponent getActivityComponent() {
        return DaggerActivityComponent
                .builder()
                .baseAppComponent(BaseApp.getInstance().getAppComponent())
                .activityModule(getActivityModule())
                .build();
    }

    protected ActivityModule getActivityModule() {
        return new ActivityModule(this);
    }

    /**
     * 初始化布局
     */
    public abstract int initLayout();


    /**
     * 初始化数据
     */
    public abstract void initData();


    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mPresenter != null)
            mPresenter.detachView();
        mUnBinder.unbind();
    }


}


没什么亮点啥的,就是简单的封装,我这项目是基于组件化+MVP开发的,可能你看到了Presenter这些东西。

总结

其实主要的东西还是讲解如何在组件化开发中配置Dagger 让你更省时更省力,节省代码量和错误量。绕过很多坑

ending

上面可能有说不明白的,可以直接评论中@我,我会及时回应,或者有说哪里不正确的有优化的地方都可以@我,欢迎讨论,如果这篇文章反应比较好的话,打算出一篇组件化架构+MVP架构混合开发。希望文章带来的是收获而非时间的浪费,谢谢大家的支持

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,431评论 25 707
  • 该文章属于<简书 — 刘小壮>原创,转载请注明: <简书 — 刘小壮> http://www.jianshu.co...
    Yiart阅读 4,578评论 3 49
  • 快到灵山顶的时候,终于看到了灵山寺。 他和她都有些疲惫了。两个人的行李都在他的背包里,零食已经所剩不多,矿泉水早就...
    郭零阅读 702评论 5 5
  • 今天看了一篇名为《好的婚姻,不可能永远靠撒娇卖萌》的文章,文中通过对比指出:一个女人不可能靠撒娇过好一生,因为婚姻...
    到处乱撞的鱼阅读 420评论 0 1
  • 盘坐于垫子上,双腿伸直,脚跟向前蹬,脚尖指向天花板。 吸气,脊柱延伸,舒展双臂,高举过头顶。 呼气上体向前向下,腹...
    aily群阅读 1,347评论 0 0