能够说已经一个多月没有更新了,mdzz这个月一直在赶项目节奏,可算是度过了这个阶段。也不能说这个月没有收获,新项目中又总结了很多经验,此次就来分享一下所感所得吧,记得以前写过一篇文章说的是组件化开发详解这篇文章可能与他息息相关。只不过是把Dagger引入了组件化开发项目中,以前那篇文章的重点是如何搭建一个组件化架构,方便团队开发配合。这篇文章的重点是把dagger引入组件化开发架构中,以前搭建组件化开发也没想到用Dagger引入项目,由于坑不是通常的多,各类错误,各类bug,让你头疼。这篇文章会把这些问题一一阐述,达到无缝链接bash
大部分都是放置位置的问题。这样会让你减小不少module里面的代码架构
先把简单的架构图放上面 方便下面一一叙述
app
从上图能够看出每一个module都会依赖于最下层的Libraryide
1.那么咱们先说在Library的gradle中如何配置吧工具
dependencies {
compile 'com.google.dagger:dagger:2.x'
annotationProcessor 'com.google.dagger:dagger-compiler:2.x'
}复制代码
2.那么接下来咱们来看看Module中如何配置Gradle文件呢!组件化
dependencies {
annotationProcessor 'com.google.dagger:dagger-compiler:2.x'
}复制代码
看到上面代码是否是很惊讶,为何在上层module中为何还要重复依赖呢,出现了一样的配置。布局
annotationProcessor 'com.google.dagger:dagger-compiler:2.x'复制代码
你们应该都明白这行代码的主要功能是用于生成代码的。底层library里面不是已经有了吗?为何在上层module中还出现呢?这是一个坑。下面我会一一解释gradle
其实dagger 中的Module的放置位置很重要,由于module 是用于component注入到各个Activity里面的,以前的mv*这些架构Di这些东西都是放在Application module里面的,可是咱们既然是组件化开发,确定要知道咱们的初衷,咱们的BaseLibrary究竟是干吗的。给上层module提供各类工具各类方便,让各个module开发互相不干扰。优化
那么固然是把各类module放在最底层的library中的了如ActivityModule, FragmentModule,AppModule 这些我只是简单的举例,可能还有不少Module,其实这里说到module 可能也会明白上面的为何在最底层library中也添加代码生成ui
annotationProcessor 'com.google.dagger:dagger-compiler:2.x'复制代码
为了生成相应的module代码。提供上面component使用。
这个问题也是我在开发中出现的,因为以前只是在mv*架构中使用Dagger 在组件化架构中开发知道坑多,没用Dagger,那么咱们来看看如何放置咱们的Activity/Fragment/App Component等等这些位置。这里我只举例而咱们的ActivityComponent和AppComponent的放置位置。
1.AppComponent如何放置,固然是放在咱们的BaseLibrary中了,由于是App全局都须要用的,因此咱们这个能够写在咱们最底层的Library中,而后上层module均可以用到。其实以前我是每一个Module都放的,发现这样写真是不少冗余的代码,没有脱离mvp那
个结构 致使的。
2.ActivityComponent如何放置呢?可能会比较麻烦由于每一个上层Module用到的都要放置一个对应的ActivityComponent
@PerActivity
@Component(dependencies = BaseAppComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
Activity getActivity();
void inject(VoiceActivity mainActivity);
ity);
}复制代码
从上面代码也能够看出 咱们为何每一个组件Module为何都放置一个ActivityComponent,由于若是你放置在底层Library中,你根本不知道你的哪一个activity要用到,并且library也是拿不到上层Module里面的任何东西 底层library只是一个供给者 而非索取者。
可是咱们的AppComponent不须要知道咱们须要哪些东西,咱们只是负责提供东西。
若是你的项目按照上面的配置,这时你已经绕过了不少坑的地方
说道封装Base 这时候须要提到一个问题就是以前那一篇文章说道了一个问题 module与Application之间调用的问题 我也提供了解决方案,就是在底层Library中写个BaseApplication来供上层调用。
那么咱们回归正题,这里只说App 和 Activity的Base封装
public abstract class BaseApp extends Application {
protected static BaseApp app;
public static BaseApp getInstance() {
return app;
}
protected abstract void initSDK();
public BaseAppComponent getAppComponent() {
return DaggerBaseAppComponent.builder()
.appModule(new AppModule(this))
.retrofitModule(new RetrofitModule(this))
.build();
}
}复制代码
这时候就体现了上面说道的Component和Module放置位置的重要性。 咱们的module 和APPComponent都是放在底层Library
public abstract class BaseMvpActivity<T extends BasePresenter> extends AppCompatActivity implements BaseView {
@Inject
protected T mPresenter;
public static Activity mContext;
private Unbinder mUnBinder;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(initLayout());
mContext = this;
mUnBinder = ButterKnife.bind(this);
initInject();
if (mPresenter != null) {
mPresenter.attachView(this);
}
initData();
}
protected abstract void initInject();
protected ActivityComponent getActivityComponent() {
return DaggerActivityComponent
.builder()
.baseAppComponent(BaseApp.getInstance().getAppComponent())
.activityModule(getActivityModule())
.build();
}
protected ActivityModule getActivityModule() {
return new ActivityModule(this);
}
/**
* 初始化布局
*/
public abstract int initLayout();
/**
* 初始化数据
*/
public abstract void initData();
@Override
protected void onDestroy() {
super.onDestroy();
if (mPresenter != null)
mPresenter.detachView();
mUnBinder.unbind();
}
}复制代码
没什么亮点啥的,就是简单的封装,我这项目是基于组件化+MVP开发的,可能你看到了Presenter这些东西。
其实主要的东西仍是讲解如何在组件化开发中配置Dagger 让你更省时更省力,节省代码量和错误量。绕过不少坑
上面可能有说不明白的,能够直接评论中@我,我会及时回应,或者有说哪里不正确的有优化的地方均可以@我,欢迎讨论,若是这篇文章反应比较好的话,打算出一篇组件化架构+MVP架构混合开发。但愿文章带来的是收获而非时间的浪费,谢谢你们的支持