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.pngView 层
image.pngPresenter层
image.pngActivity中引用
image.png此处注意点事mainModule()这个构造函数,是我们要设置的,意思类似于 吧MainView 设置进去.方便presenter持有这个对象.