美文网首页
Dagger2理解与记录

Dagger2理解与记录

作者: livesxu | 来源:发表于2020-06-03 00:11 被阅读0次

    对注入类和被注入类的解耦合,给被注入类生成一个对象。

    A.首先从简单的入手,被注入类无参:

    创建一个activity,有一个类是Fragment1的属性fragment1,对这个属性@Inject 在类Fragment1中,创建一个实例方法,用于构建实例对象,对这个方法@Inject 创建一个组分接口类,里面有一个接口说明对谁的属性进行的@Inject:MainActivity

    在MainActivity中启动:DaggerF1Component.create().inject(this);

    一共生成了3个类:

    首先是DaggerF1Component,就像是一个组装器一样,它是入口。

    initialize初始化了fragment1Provider和mainActivityMembersInjector,分别代表着Fragment1和MainActivity Fragment1_Factory就是用来生成Fragment1对象的 MainActivity_MembersInjector接收了fragment1Provider,并实现了F1Component接口让MainActivity绑上fragment1对象

    B.被注入类有参:

    会麻烦不少,毕竟无参的时候用和不用Dagger2也看不出什么差别,反而繁琐了。看到的很多Dagger2的作用都是解耦并且让入参变动对依赖类无甚影响,其实我还不明白为什么。大多以MVP举例,我就不用MVP了。

    我现在要MainActivity传一个TextView给Fragment1,把这个TextView展示在界面上。

    添加了一个传递的参数testView,启动方法也改了,将模块添加了进去 component绑定了模块 更改了Fragment1的实例方法,接收入参textView,将其展示切片在右下角 添加了一个模块类ModuleForTextView,也是接收了传参,并把这个参数通过providexxx的方法作为返回值返回了

    在MainActivity中启动:DaggerF1Component.builder().moduleForTextView(new ModuleForTextView(textView)).build().inject(this);

    一共生成了4个类,其中MainActivity_MembersInjector无变动:

    主要变动了构造,因为Builder里面接收了Module的实例,把实例给了ModuleForTextView_ProvideTextViewFactory生成了provideTextViewProvider;然后把provideTextViewProvider又给了Fragment1,就是模块入参就等于是Fragment1入参了 就在这把模块的入参给了Fragment1 ModuleForTextView_ProvideTextViewFactory拿了模块入参创建了对象,get返回了入参的textView

    这时候我Fragment1又要加一个入参了,这时候可以加一个模块,加一个Button试一下。

    添加了一个module,启动时加上 绑定也加上 Fragment1的实例方法加了一个button Component的变动 最终效果

    理解:

    1.Component负责组装、启动,通过被注入类的MembersInjector injectMembers 注入属性;

    2.Module是被组装的一个模块,一个积木,最终形态要符合注入类的形态,通过providexxx将东西给出去;

    3.@Inject注释的实例构造方法决定了形态。

    4.应该用于某种组装业务或者组装逻辑场景。类似flutter的fish_redux。

    注:如果一样的类型区分不了那就得用@Qualifier,See.

    Demo

    学习参考:

    Dagger 2 的基本使用与原理

    Dagger2从入门到放弃再到恍然大悟

    相关文章

      网友评论

          本文标题:Dagger2理解与记录

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