能夠說已經一個多月沒有更新了,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架構混合開發。但願文章帶來的是收穫而非時間的浪費,謝謝你們的支持