Google 宣布廢棄 LiveData.observe 方法



通過這篇文章你將學(xué)習(xí)到以下內(nèi)容:
我們先來看看官方是如何解釋,如下圖所示:

在 Kotlin 1.4 上本身能夠?qū)⒛J(rèn)的?observe()?方法轉(zhuǎn)換為?lambda?語法,以前只有在使用 Kotlin 擴(kuò)展時(shí)才可用。因此將?LiveData.observe()?擴(kuò)展方法廢棄掉了。
在 Kotlin 1.4 之前?LiveData.observe()?寫法如下所示。
liveData.observe(this,?Observer<String>?{
????//?......
})但是這種寫法有點(diǎn)復(fù)雜,因此 Google 在?lifecycle-livedata-ktx庫中添加了擴(kuò)展方法,使代碼更簡潔,可讀性更強(qiáng)。
liveData.observe(this){
????//?......
}
在 Kotlin 1.4 時(shí),增加了一個(gè)新的特性?SAM conversions for Kotlin interfaces,支持將 SAM(單一抽象方法)接口,轉(zhuǎn)換成 lambda 表達(dá)式,因此廢棄了?LiveData.observe()?擴(kuò)展方法。所以升級?lifecycle-livedata-ktx?庫到最新版本,將會(huì)出現(xiàn)如下提示。
https://kotlinlang.org/docs/whatsnew14.html#sam-conversions-for-kotlin-interfaces


遷移也非常簡單,升級到 Kotlin 1.4 之后,只需要移除掉下列包的導(dǎo)入即可。
import?androidx.lifecycle.observe接下來我們一起來了解一下?LiveData.observe()?擴(kuò)展方法的由來,源于一位大神在 issuetracker 上提的一個(gè)問題, 如下圖所示:
https://issuetracker.google.com/issues/111179594?pli=1

大神認(rèn)為 SAM 轉(zhuǎn)換,可以使代碼更簡潔,可讀性更強(qiáng),因此期望 Google 能夠支持,現(xiàn)階段?LiveData.observe()?寫法相比 java8 是比較復(fù)雜的。
//?java8
liveData.observe(owner,?name?->?{
????//?......
});
//?SAM?轉(zhuǎn)換之前
liveData.observe(this,?Observer?{?name?->?
????//?......
})
//?SAM?轉(zhuǎn)換之后
liveData.observe(this){?name?->?
????//?......
} 這里需要插入兩個(gè) Kotlin 語法的知識點(diǎn):
什么是函數(shù)式(SAM)接口
只有一個(gè)抽象方法的接口稱為函數(shù)式接口或 SAM(單一抽象方法)接口。函數(shù)式接口可以有多個(gè)非抽象成員,但只能有一個(gè)抽象成員。
什么是 SAM 轉(zhuǎn)換
對于函數(shù)式接口,可以通過 lambda 表達(dá)式實(shí)現(xiàn) SAM 轉(zhuǎn)換,從而使代碼更簡潔,可讀性更強(qiáng),代碼如下所示。
fun?interface?ByteCode?{
????fun?follow(name:?String)
}
fun?testFollow(bytecode:?ByteCode)?{
????//?......
}
//?傳統(tǒng)的使用方法
testFollow(object?:?ByteCode{???
????override?fun?follow(name:?String)?{
????????//?......
????}
})
//?SAM?轉(zhuǎn)換
testFollow{
????//?......
}
在 Kotlin 1.4 之前不支持實(shí)現(xiàn) SAM 轉(zhuǎn)換,于是 Google 在?lifecycle-livedata-ktx?庫中添加了?LiveData.observe()?擴(kuò)展方法,commit 如下圖所示。

在 Kotlin 1.4 之后, Kotlin 開始支持 SAM 轉(zhuǎn)換,所以 Google 廢棄?LiveData.observe()?擴(kuò)展方法, Google 工程師也對此進(jìn)行了討論,如下圖所示。

大神 Sergey Vasilinets 建議,為了不破壞源代碼兼容性,只是在這個(gè)版本中棄用。在以后的版本更新中將會(huì)更新錯(cuò)誤級別為 error,因此在這里建議如果已經(jīng)升級到了 Kotlin 1.4,將下列包的導(dǎo)入從代碼中移除即可。
import?androidx.lifecycle.observe在 Kotlin 1.5.0 中使用 dynamic invocations (invokedynamic)????進(jìn)行編譯,實(shí)現(xiàn) SAM(單一抽象方法) 轉(zhuǎn)換,這個(gè)就不在本文討論范圍內(nèi),放在以后進(jìn)一步分析。
https://kotlinlang.org/docs/whatsnew15.html#sam-adapters-via-invokedynamic
往 期 推 薦
1、致歉!抖音Semi Design承認(rèn)參考阿里Ant Design 2、對比7種分布式事務(wù)方案,還是偏愛阿里開源的Seata,真香! 3、Redis存儲結(jié)構(gòu)體信息,選hash還是string? 4、掃盲 docker 常用命令 5、最全分布式Session解決方案 6、21 款 yyds 的 IDEA插件 7、真香!用 IDEA 神器看源碼,效率真高! 點(diǎn)分享
點(diǎn)收藏
點(diǎn)點(diǎn)贊
點(diǎn)在看





