Dagger2 + DataBinding踩坑之旅

0.096字数 582阅读 1007

在最近的项目中,大量的使用到了Dagger2 和 DataBinding,在实际操作的过程中,遇到了很多坑,这里把这些坑做个简单的记录,方便自己也方便同样遇到这些问题的读者。


Dagger2错误排查

Dagger2最坑的一个地方是错误排查的困难,相信很多人都有这样的经历。已经按照文档来使用,看似一切正常,但在编译运行时,就报“找不到符号 DaggerXXXX”, 如果你同时使用到了databinding,你还会看到“找不到符号 BR”, “找不到符号 xxxxBinding”,当你的项目比较大的时候,你会看到100+的这样类型的错误,简直让人吐血。

Dagger2、DataBinding、ButterKnife、DbFlow等这些第三方库都是基于Annotation,它们在编译时动态生成代码,它们之间会相互影响,一个出错了,会导致Annotation编译时中断。排查的方式是在项目的主build.gradle文件中添加下面的脚本,这个设置可以突破Android Studio Terminal 100 error的限制,把所有的错误输出,然后你就会发现原来只是一个小错误导致的100+ errors,比如说ButterKnife id错误,dataBinding 缺失对应的binding方法。

allprojects {
    afterEvaluate {
        tasks.withType(JavaCompile.class) {
            options.compilerArgs << "-Xmaxerrs" << "500"
        }
    }
}

相关参考:

Dagger 2 swallows errors

Dagger2与android.databinding.DataBindingComponent

DataBindingComponent是Android DataBinding中一个很重要的接口,在DataBindingUtil中,至少有三处地方需要用到这个类:setDefaultComponent、inflate、setContentView,这个类在扩展BindingAdapter的时候需要用到。

关于扩展BindingAdapter,简单说两句,扩展有两种方式:静态的全局扩展和非静态的可自定义Binding作用域的扩展。对于前者,可参考Android Developer: BindingAdapter;对于后者,可参考Using Android data binding adapters with dagger2

前面废话这么多,其实还没说到这节的重点,重点就是这句话 “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);
}

推荐阅读更多精彩内容