Android dagger2

2020-01-20  本文已影响0人  jimdear

gradle引入流程

implementation 'com.google.dagger:dagger:2.15'
annotationProcessor 'com.google.dagger:dagger-compiler:2.15'

简述dagger2 之为啥要用dagger2

1.比如有一些构造函数,一开始写了new XXX(X,X),如果后续要继续加多一个数值,那么就会非常麻烦,而dagger利用了桥接模式.新的变量通过桥接模式动态化地引入.很好的避免了代码的修改
2.优化代码结构,方便团队协作和代码可阅读性.

dagger2 简单用法

@Inject标签

@Inject
ShowBean showBean;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView tvShow = findViewById(R.id.tv_show);
    DaggerMainView.builder()
            .build()
            .inject(this);
    tvShow.setText(showBean.getMessage());
}

@name标签

@Named("release")
@Inject
ShowBean showBean;

然后在相应的module中填写相应的业务逻辑代码,这种模式可以区分不同业务场景下,比如dev和relase 下是否要走测试方法或者realse正式的方法之类的,可用于自动化测试或测试环境特殊判断.

@Named("dev")
@Provides
ShowBean providerDevShow() {
    ShowBean showBeanDev = new ShowBean();
    showBeanDev.setMessage("dev_SHow");
    return showBeanDev;

}

@Named("release")
@Provides
ShowBean providerReleaseShow() {
    ShowBean showBeanRelease = new ShowBean();
    showBeanRelease.setMessage("release_SHow");
    return showBeanRelease;
}

module类的配置及@@Component 标签

@Component(modules = MainModule.class)
public interface MainView {
void inject(MainActivity activity);
}

构建简单的bean类

String message = "show message";

String name;

@Inject
public ShowBean( ) {
}

public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

以上配置就可以在容器控件中通过 @Inject ShowBean showBean;得到相应的标签,并且使用.把代码放在module层,activity中比较优雅.

那么dagger如何在MVP中使用呢

直接贴上代码

module层

image.png

View 层

image.png

Presenter层

image.png

Activity中引用

image.png

此处注意点事mainModule()这个构造函数,是我们要设置的,意思类似于 吧MainView 设置进去.方便presenter持有这个对象.

上一篇下一篇

猜你喜欢

热点阅读