[包教包会]dagger2使用教程(二)使用module

上回我们点了个包子外卖,这次我点了个可乐。这下遇到问题了,包子是自己做的,在包子类内部可以使用@inject。可是可乐不是自己做的,我们不能打开啊。@inject不好用了,怎么办?对应的android上的问题就是,如果我要注入的类是来自第三方库,没办法直接修改,我就不能再该类中使用@inject。
解决这个方法是@module和provide。
首先,先建一个可乐的bean。有一个品牌属性,假装是来自第三方库的,无法修改,不能加入@inject。这个没难度,大家都能理解。

public class Cola {
    String brand = "百事";

    Cola() {
    }
}

下面建一个module。


@Module
public class SecondActivityModule {
    @Provides
    Cola offerCola() {
        return new Cola();
    }
}

用@Module来表明这个类是Module,内部用@Provides 下面的方法能提供我们需要的可乐类。
Module相当于一个打包盒,能够把我们需要的可乐类装在里面。因为这个类不能加@inject,所以需要用@Module和@Provides

接下来需要告诉送餐员,要送什么到哪里去。也就是要告诉dagger2的component把哪个类注入到哪个Activity。创建接口SecondActivityComponent如下:

import dagger.Component;

@Component(modules = SecondActivityModule.class)
public interface SecondActivityComponent {
    void inject(SecondActivity activity);
}

(modules = SecondActivityModule.class)这句话的意思是告诉component需要传送的类是在SecondActivityModule里面找。换句话说是要送的餐点在SecondActivityModule里面。

void inject(SecondActivity activity);这句代码的意思是告诉component,要把需要的注入的类送到SecondActivity里面。

最后,在Activity里面写

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

然后就可以在Activity里面使用Cola这个类了。
Activity代码如下:


/**
 * @author fan
 */
public class SecondActivity extends AppCompatActivity {

    Button btnEat;

    @Inject
    Cola cola;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnEat = findViewById(R.id.eat);
        btnEat.setText("喝");
        DaggerSecondActivityComponent.builder().build().inject(this);
        btnEat.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(SecondActivity.this, "可乐品牌是" + cola.brand, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

总结:
本篇讲的是不能使用@inject的时候,可以使用@module和@Provides达到注入效果

demo地址 https://github.com/eminfan/DaggerDemo

下一篇 介绍module加参数
https://www.jianshu.com/p/ae0ce11684ba

你可能感兴趣的:([包教包会]dagger2使用教程(二)使用module)