美文网首页别人的经验
Dagger2 + DataBinding踩坑之旅

Dagger2 + DataBinding踩坑之旅

作者: 浪淘沙xud | 来源:发表于2018-08-28 16:42 被阅读115次

    在最近的项目中,大量的使用到了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);
    }
    

    相关文章

      网友评论

        本文标题:Dagger2 + DataBinding踩坑之旅

        本文链接:https://www.haomeiwen.com/subject/rydqwftx.html