升級(jí)AS3.6和Gradle3.6.0引致的問題修復(fù)總結(jié)

今天循例升級(jí)了Android Studio3.6和Gradle3.6.0,一如既往的,發(fā)生了升級(jí)帶來的各種問題,特別是這還是一個(gè)大版本升級(jí)。結(jié)果更新好之后編譯就出現(xiàn)了下面的問題

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之,發(fā)現(xiàn)官方的AS3.6beta2升級(jí)說明文檔里也提及了這個(gè)問題

WX20200229-105748.png

點(diǎn)擊問題鏈接之后看到11樓的描述有了點(diǎn)問題發(fā)生的指引,發(fā)現(xiàn)鏈接里面描述的問題跟我一模一樣,而我之前確實(shí)也在xml里使用過obs.get()/livedata.getValue()方法,隨后用AS的查找功能給一一去掉后就沒有這個(gè)問題發(fā)生了

WX20200229-105905.png

WX20200229-105921.png

然而像這種大特性的更新帶來的問題肯定不止一個(gè),接下來編譯出現(xiàn)各種類型轉(zhuǎn)換的問題和找不到方法的問題,其實(shí)都可以總結(jié)就是ViewBinding引入后調(diào)整了編譯生成的各個(gè)Binding類所產(chǎn)生的問題

企業(yè)微信截圖_d2675c61-e56c-4dda-ad3b-7b3ec5d7c0db.png

這里的錯(cuò)誤列表列出來的問題無外乎兩種

1.類型轉(zhuǎn)換錯(cuò)誤
2.找不到方法

其中錯(cuò)誤2找不到方法,很大原因其實(shí)是因?yàn)殄e(cuò)誤1類型轉(zhuǎn)換出錯(cuò)引申的問題,只要解決錯(cuò)誤1就會(huì)隨之解決錯(cuò)誤2

下面是解決問題的具體思路,不想看的可以直接看最后一段的高亮總結(jié)

類型轉(zhuǎn)換錯(cuò)誤具體錯(cuò)誤提示為

[package]/databinding/HeaderProductBinding.java:171: 錯(cuò)誤: 不兼容的類型: ItemMagazineSimpleProductBinding無法轉(zhuǎn)換為ViewDataBinding

點(diǎn)擊跳轉(zhuǎn)到這個(gè)錯(cuò)誤的具體位置

setContainedBinding(this.frameSimpleProducts);

是一個(gè)很簡(jiǎn)單的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;
        }
    }

從這個(gè)方法的具體實(shí)現(xiàn)和參數(shù)命名可以具體猜測(cè)到是xml里include的layout出現(xiàn)了問題,查看xml后發(fā)現(xiàn)果不其然,有這么一行代碼

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

“frame_simple_products”這個(gè)id正好對(duì)上setContainedBinding(this.frameSimpleProducts);這個(gè)報(bào)錯(cuò)方法的參數(shù)名,而as編譯出錯(cuò)的提示語“不兼容的類型: ItemMagazineSimpleProductBinding無法轉(zhuǎn)換為ViewDataBinding”里的“ItemMagazineSimpleProductBinding”也正正是include的這個(gè)layout生成的Binding類。

也就是說這個(gè)被include的layout生成的Binding類不是ViewDataBinding類,而查看報(bào)錯(cuò)的HeaderProductBinding類發(fā)現(xiàn)現(xiàn)在凡是實(shí)現(xiàn)了DataBinding的xml生成的實(shí)現(xiàn)類都是繼承自ViewDataBinding,亦即是說實(shí)現(xiàn)了DataBinding的xml其include的layout也需要實(shí)現(xiàn)DataBinding,手動(dòng)把所有被include的layout轉(zhuǎn)換成DB即可

問題解決,編譯通過!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容