美文网首页
升级AS3.6和Gradle3.6.0引致的问题修复总结

升级AS3.6和Gradle3.6.0引致的问题修复总结

作者: Haygor | 来源:发表于2020-03-01 17:56 被阅读0次

    今天循例升级了Android Studio3.6和Gradle3.6.0,一如既往的,发生了升级带来的各种问题,特别是这还是一个大版本升级。结果更新好之后编译就出现了下面的问题

    e: error: cannot generate view binders java.lang.StackOverflowError
    at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:209)
    at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:211)
    at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:211)
    at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:211)
    at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:211)
    

    Google之,发现官方的AS3.6beta2升级说明文档里也提及了这个问题

    WX20200229-105748.png

    点击问题链接之后看到11楼的描述有了点问题发生的指引,发现链接里面描述的问题跟我一模一样,而我之前确实也在xml里使用过obs.get()/livedata.getValue()方法,随后用AS的查找功能给一一去掉后就没有这个问题发生了

    WX20200229-105905.png
    WX20200229-105921.png

    然而像这种大特性的更新带来的问题肯定不止一个,接下来编译出现各种类型转换的问题和找不到方法的问题,其实都可以总结就是ViewBinding引入后调整了编译生成的各个Binding类所产生的问题

    企业微信截图_d2675c61-e56c-4dda-ad3b-7b3ec5d7c0db.png

    这里的错误列表列出来的问题无外乎两种

    1.类型转换错误
    2.找不到方法

    其中错误2找不到方法,很大原因其实是因为错误1类型转换出错引申的问题,只要解决错误1就会随之解决错误2

    下面是解决问题的具体思路,不想看的可以直接看最后一段的高亮总结

    类型转换错误具体错误提示为

    [package]/databinding/HeaderProductBinding.java:171: 错误: 不兼容的类型: ItemMagazineSimpleProductBinding无法转换为ViewDataBinding
    

    点击跳转到这个错误的具体位置

    setContainedBinding(this.frameSimpleProducts);
    

    是一个很简单的set方法

    /**
         * Used internally to set the containing binding for an included binding to this.
         *
         * @hide
         */
        protected void setContainedBinding(ViewDataBinding included) {
            if (included != null) {
                included.mContainingBinding = this;
            }
        }
    

    从这个方法的具体实现和参数命名可以具体猜测到是xml里include的layout出现了问题,查看xml后发现果不其然,有这么一行代码

    <include
                    android:id="@+id/frame_simple_products"
                    layout="@layout/item_magazine_simple_product" />
    

    “frame_simple_products”这个id正好对上setContainedBinding(this.frameSimpleProducts);这个报错方法的参数名,而as编译出错的提示语“不兼容的类型: ItemMagazineSimpleProductBinding无法转换为ViewDataBinding”里的“ItemMagazineSimpleProductBinding”也正正是include的这个layout生成的Binding类。

    也就是说这个被include的layout生成的Binding类不是ViewDataBinding类,而查看报错的HeaderProductBinding类发现现在凡是实现了DataBinding的xml生成的实现类都是继承自ViewDataBinding,亦即是说实现了DataBinding的xml其include的layout也需要实现DataBinding,手动把所有被include的layout转换成DB即可

    问题解决,编译通过!

    相关文章

      网友评论

          本文标题:升级AS3.6和Gradle3.6.0引致的问题修复总结

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