美文网首页Android开发半栈工程师Android技术知识
[包教包会]dagger2使用教程(一)最基本的用法

[包教包会]dagger2使用教程(一)最基本的用法

作者: 范范范范范范 | 来源:发表于2018-06-06 17:00 被阅读87次

    本文适用读者:已经熟练掌握Android编程,并且用过butterknife的程序员。最好是看了很多其他dagger2文章还没有学会的人。

    dagger2,是什么?依赖注入框架。什么是依赖注入?咱说人话,依赖,就是需要某个东西,没有它不行。注入,把一个东西送到另一个东西里面。依赖注入啥意思?就是把需要东西送到某个地方。比如,你要写钢笔字,钢笔没水了。你需要墨水,把墨水注入到钢笔里。加墨水这个动作,就是依赖注入。在咱android上就是,你在某个Activity里面需要某个类,通过dagger2把这个类送到这个Activity里,你可以在这个Activity里使用这个类。

    下面讲dagger2,打开android studio。创建一个新project。在build gradle里粘贴下面的代码,然后synk

    
    compile'com.google.dagger:dagger:2.16'
    
    annotationProcessor'com.google.dagger:dagger-compiler:2.16'
    
    

    既然是包教包会,我们就以包子为例。

    先建一个包子类,韭菜包子。

    import javax.inject.Inject;
    
    public class Baozi {
        String type = "韭菜";
    
        @Inject
        public Baozi() {
        }
    }
    

    和以前不一样的地方是有个“@Inject”,这是个注解,就是说,我们要送的东西,就是包子这个类。大家用过butterKinfe黄油刀吧?和butterknife那个@bind或者@bindview 很像。

    MainActivity,相当于办公室,使用(食用)包子的一个场景。

    我写了个按钮,点一下,能吃包子,知道什么馅的。


    image.png
    public class MainActivity extends AppCompatActivity {
    
        Button btnEat;
        @Inject
        Baozi baozi;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    //绑定       
     btnEat = findViewById(R.id.eat);
    //点击事件
            btnEat.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, baozi.type, Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
    

    包子有了,Activity是咱的办公室。现在要把包子送到办公室里。或者说把Baozi类注入到MainActivity里。点了包子外卖,由送餐员送到办公室。在dagger2里,谁是送餐员呢?他的名字叫“朱建”,英文名Component。中文意思是组件。我也不知道为什么叫component这个怪名字。记住中文名叫“朱建(组件)”,英文名叫component就好了。

    创建组件,送餐员,类名是MainComponent ,要注意的是这个是个接口interface,不是类class。

    import dagger.Component;
    
    @Component()
    public interface MainComponent {
        void inject(MainActivity activity);
    }
    

    函数inject,代表要注入,也就是送餐。送到什么地方呢?写到函数参数里(MainActivity activity)。

    接下来按ctrl + F9,也就是build菜单下make project, Dagger2通过编译器会在某些文件夹下生成一些类。这个类就是我们的送餐员,它把我们需要的类(包子)送到需要的地方-办公室(MainActivity)。这个类的名字是Dagger+MainComponent ,DaggerMainComponent
    命名方式推荐为: 目标类名+Component ,在编译后Dagger2就会为我们生成 DaggerXXXComponent 这个类
    注入代码是

     DaggerMainComponent.builder().build().inject(this);
    

    在MainActivity里写上上面这句一运行,包子就送到办公室,Baozi就注入到了MainActivity里面。好奇怪,这个类竟然不用import,请高手指点为什么。

    点击“吃”按钮,toast显示“韭菜”。我们知道什么馅的了。哈哈。
    这样,dagger2最简单的使用方法你已经会了。

    image.png

    最终代码如下:

    public class MainActivity extends AppCompatActivity {
    
        Button btnEat;
    
        @Inject
        Baozi baozi;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btnEat = findViewById(R.id.eat);
    
            DaggerMainComponent
                    .builder()
                    .build()
                    .inject(this);
    
            btnEat.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, baozi.type, Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
    

    复习一下使用步骤

    1.创建要注入的类,构造方法要加@inject
    2.在你需要的地方(比如Activity里面),声明这个类时,也要加@inject
    3.创建component,声明inject方法,参数是你需要用这个类的地方,比如某个Activity。不要忘了@Component()
    4.按Ctrl + F9,或者build菜单下make project,生成daggerXXXComponent类。
    5.在Activity里写

            DaggerXXXComponent
                    .builder()
                    .build()
                    .inject(this);
    

    这样你就可以使用注入的类了。

    包教包会,现在dagger2最简单的用法你会不会了?不会的话,请留言,我改进文章,到能看会为止。

    再说一下dagger2 的优点。为什么用dagger2?直接在Activity里面new 一个类就行了。也就是说,为啥要送餐员?直接在办公室做包子就行了。问题是,Activity可能有很多。万一这个类的构造方法发生改变,就要在每一个Activity里面重写构造方法。如果包子要改成猪肉馅的,要在每个办公室里改包子。重复很多遍。如果用dagger2,只要在要注入的类里面改就好了。只需要改一遍。

    下一篇介绍dagger2更多的用法。
    https://www.jianshu.com/p/807fd29283f4

    相关文章

      网友评论

        本文标题:[包教包会]dagger2使用教程(一)最基本的用法

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