在最近的項目中,大量的使用到了Dagger2 和 DataBinding,在實際操作的過程中,遇到了很多坑,這里把這些坑做個簡單的記錄,方便自己也方便同樣遇到這些問題的讀者。
Dagger2錯誤排查
Dagger2最坑的一個地方是錯誤排查的困難,相信很多人都有這樣的經(jīng)歷。已經(jīng)按照文檔來使用,看似一切正常,但在編譯運行時,就報“找不到符號 DaggerXXXX”, 如果你同時使用到了databinding,你還會看到“找不到符號 BR”, “找不到符號 xxxxBinding”,當(dāng)你的項目比較大的時候,你會看到100+的這樣類型的錯誤,簡直讓人吐血。
Dagger2、DataBinding、ButterKnife、DbFlow等這些第三方庫都是基于Annotation,它們在編譯時動態(tài)生成代碼,它們之間會相互影響,一個出錯了,會導(dǎo)致Annotation編譯時中斷。排查的方式是在項目的主build.gradle文件中添加下面的腳本,這個設(shè)置可以突破Android Studio Terminal 100 error的限制,把所有的錯誤輸出,然后你就會發(fā)現(xiàn)原來只是一個小錯誤導(dǎo)致的100+ errors,比如說ButterKnife id錯誤,dataBinding 缺失對應(yīng)的binding方法。
allprojects {
afterEvaluate {
tasks.withType(JavaCompile.class) {
options.compilerArgs << "-Xmaxerrs" << "500"
}
}
}
相關(guān)參考:
Dagger2與android.databinding.DataBindingComponent
DataBindingComponent是Android DataBinding中一個很重要的接口,在DataBindingUtil中,至少有三處地方需要用到這個類:setDefaultComponent、inflate、setContentView,這個類在擴展BindingAdapter的時候需要用到。
關(guān)于擴展BindingAdapter,簡單說兩句,擴展有兩種方式:靜態(tài)的全局?jǐn)U展和非靜態(tài)的可自定義Binding作用域的擴展。對于前者,可參考Android Developer: BindingAdapter;對于后者,可參考Using Android data binding adapters with dagger2
前面廢話這么多,其實還沒說到這節(jié)的重點,重點就是這句話 “If using Dagger 2, the developer should extend this interface and annotate the extended interface as a Component.”。意思就是,在Dagger2中使用Component,如果這個Component要在DataBinding中的類中使用,需要繼承DataBindingComponent。具體使用如下:
@Component(dependencies = AppComponent.class, modules = DataBandingModule.class)
public interface DJDataBandingComponent extends android.databinding.DataBindingComponent {
// MainFragment使用了databinding
void inject(MainFragment mainFragment);
}