Jetpack Compose使用體驗(yàn)
這幾天把Jetpack全家桶用了個(gè)遍,其中Compose算是印象最深的了。xml寫布局真的很痛苦,因?yàn)橹貜?fù)的事情太多了,寫布局,給id,Activity里面獲取id,設(shè)置點(diǎn)擊事件......這一套我代碼我從16年寫到現(xiàn)在,別提多折磨人了。
現(xiàn)在好了,id不用給,點(diǎn)擊事件在定義“控件”時(shí)直接就可以寫,不用忍受在xml和java代碼之間反復(fù)橫跳的折磨,一個(gè)kotlin全部搞定。
那么進(jìn)入正題,這幾天使用Compose的體驗(yàn)。說是體驗(yàn),其實(shí)也就寫了一個(gè)小工具,可以在手機(jī)電腦之間傳輸數(shù)據(jù),且不需要電腦端裝什么軟件。以前手機(jī)電腦傳文件都是用的QQ,實(shí)在沒有必要,明明就在同一局域網(wǎng),還非要通過騰訊的服務(wù)器中轉(zhuǎn),很蠢。
然后網(wǎng)上搜了一下類似的軟件,都需要電腦端也裝一個(gè)軟件。用FTP又太臃腫了,而且安卓端的FTP服務(wù)器沒一個(gè)能用的......最后還是自己寫了一個(gè),終于舒服了,地址:
https://github.com/ColorlessCat/Kamui
原理是實(shí)現(xiàn)一個(gè)簡單的Web服務(wù)器,用電腦上的瀏覽器去訪問,通過Http請求傳輸文件。
然后Jetpack Compose體驗(yàn)下來,最直觀的感受就是:我是自由的!
首先Compose把視圖的更新問題給解決了,如果不用DataBinding,以前在數(shù)據(jù)更新時(shí)是需要手動(dòng)更新View的。具體一點(diǎn)的話,我寫過一個(gè)類似音樂播放器的東西,隨著時(shí)間流逝,就需要更新進(jìn)度條,當(dāng)時(shí)的處理是提供一個(gè)接口,讓那些需要得到播放進(jìn)度的類來實(shí)現(xiàn)這個(gè)接口,然后進(jìn)度更新時(shí)回調(diào)接口里的方法......其實(shí)就是觀察者模式。
這件事現(xiàn)在Compose是自動(dòng)處理的,當(dāng)數(shù)據(jù)更新時(shí)會(huì)觸發(fā)“重組”,所有視圖自動(dòng)更新,而且可以配合LiveData和Viewmodel使用。
所以作為使用者,生命周期,視圖的更新等等問題都可以不用考慮,可以只關(guān)注功能和UI兩個(gè)部分了。
剛剛說了重組,一個(gè)Compose組件就是一個(gè)函數(shù),所謂的重組就是重新調(diào)用一次這個(gè)函數(shù)。因此寫布局的思維也變得自由了,比如以前要隱藏一個(gè)View,得設(shè)置Visibility為GONE,想要尋找隱藏的代碼時(shí)就很麻煩?,F(xiàn)在如果知道一個(gè)“控件”是可能被隱藏的,那直接加一個(gè)boolean類型的變量然后在控件前加個(gè)if就可以了。怎么說呢,UI的變化變得更加直觀了,View那一套因?yàn)榭刂芔I的代碼七零八落,有的時(shí)候得翻好久才能找到,而且UI和數(shù)據(jù)黏在一起,少了一個(gè)就沒法運(yùn)行,現(xiàn)在就清晰太多了。
然后Compose有一種“實(shí)時(shí)渲染”的感覺。體現(xiàn)在代碼上就是,假如給一個(gè)組件多次設(shè)置padding,后設(shè)置的padding并不會(huì)覆蓋之前的設(shè)置,而是會(huì)增加padding。也就是說“控件”的渲染是一行代碼一行代碼往下進(jìn)行的,這一點(diǎn)很重要,會(huì)改變寫布局的思維。我一開始想把一個(gè)邊框按鈕的邊框給去掉,但是怎么設(shè)置border都沒用,邊框根本去不掉.....睡了一覺才想明白,這樣才對,以前TextView經(jīng)??梢援?dāng)Button用,很多控件的使用范圍并沒有那么嚴(yán)格規(guī)定,現(xiàn)在好了,邊框按鈕就是邊框按鈕,它必須有邊框,就很合理。
其實(shí)很多東西教程已經(jīng)說過了,比如什么聲明式,命令式......但是果然還是得用自己的話說出來?!奥暶魇?命令式......”類似的概念誰都會(huì)說,但這些概念到底有什么意義,對使用有什么影響,還是需要去思考的。
總結(jié),View體系用起來好像在搭積木,搭完還得做各種裝飾,這個(gè)過程麻煩且可能把所有積木推倒;Compose用起來就好像在畫畫,寫一行代碼就畫一筆,而且不用思考畫完以后怎么去修改,因?yàn)槊恳粋€(gè)Compose組件都是函數(shù),所以畫出來的并不是一個(gè)結(jié)果,而是過程,在聲明一個(gè)界面的同時(shí)就已經(jīng)把諸如更新,點(diǎn)擊事件,動(dòng)畫,隱藏顯示等等問題給處理了。
Jetpack Compose YYDS!