今天循例升級(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è)問題

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


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

這里的錯(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即可
問題解決,編譯通過!