很久沒寫技術(shù)文章了瞭稼,一方面是因為懈怠了,另一方面是沒有什么能引發(fā)自己的思考腻惠,或許有思考环肘,但覺得不值一提。只是最近對flutter有點興趣集灌,看了些文檔悔雹,還算是有點收獲的。其實我確實不想寫一些關(guān)于用法的文章绝页,因為我覺得flutter的文檔比我寫的好多了荠商。我的側(cè)重點還是在于對設(shè)計,對觀念的理解续誉。
flutter文檔中有這么一句:everything is widget莱没。起初我對這句話很是不解。任何圖形界面系統(tǒng)酷鸦,不論ios,還是Android,對于界面元素的抽象不都是view嘛饰躲?我也可以這么說Android中everything is view。當(dāng)然臼隔,這是我最初的疑惑嘹裂。 那么究竟該如何理解這句話呢?
我還是用正推的方式去闡述這句話摔握,別先拋出一個結(jié)論寄狼。 首先flutter的基本目的是要建立一個平臺,用這個平臺開發(fā)的程序氨淌,能運行在不同的圖形界面系統(tǒng)泊愧,類似于java虛擬機做的那樣。我們也知道盛正,解決方式無非就是在操作系統(tǒng)和程序代碼間建立一個中間層删咱,讓中間層去適配不同的系統(tǒng)。flutter就是這么做的豪筝。當(dāng)然react native也是這么做的痰滋。
在此,我先解釋flutter和rn在具體實現(xiàn)上的不同续崖。rn采取的是以js橋接的方式敲街,簡單點說,你用js申明的每一個組件严望,在不同平臺都有相應(yīng)的原生組件多艇。因而這個中間層,做的事就是解釋你的js代碼著蟹,并用原生的方式去布局墩蔓。顯而易見的是,這種實現(xiàn)局限性相當(dāng)大萧豆,且不靈活奸披。
相比,flutter的實現(xiàn)就高明的多涮雷。文檔中特意提到了阵面,flutter的一個優(yōu)點是,它能控制屏幕上的每一個像素洪鸭。這句話的意思是样刷,flutter并不是去和原生組件做簡單的映射調(diào)用,而是自己去繪制每一個widget览爵。顯然這是能做到的置鼻,就以Android來說,我們完全可以舍棄view系統(tǒng)蜓竹,只要使用canvas,和paint就能在屏幕上畫出想要的圖形箕母。其實對于Android,view只是更高層次的抽象俱济,換句話說Android系統(tǒng)不認(rèn)識view,只認(rèn)識window嘶是,和surface(canvas)。所以flutter使用canvas,paint這些低層次
的抽象類蛛碌,完全可以開發(fā)一套widget聂喇。 所以下一個問題就是,flutter開發(fā)的這一套widget,在設(shè)計實現(xiàn)上究竟和Android蔚携,ios的原生實現(xiàn)有什么不同希太? 當(dāng)然,我還是以Android做對比浮梢。在Android中一個view,占據(jù)一定空間跛十,并具有一些基本屬性,這些屬性包括秕硝,background,padding,scale,rorate,alpha等等芥映。這些屬性共同描述了何為Android View。flutter中核心是widget,理論上和Android的view是對應(yīng)的远豺。但是widget的設(shè)計和view大有不同奈偏。這種不同就是,widget將Android view中認(rèn)為是屬性的東西剝離開來躯护。舉個簡單的例子惊来,view有background屬性,那么所有的view子類都有這個屬性棺滞。flutter中widget并沒有background屬性裁蚁,只有實現(xiàn)了background的widget子類才有這個屬性矢渊。 那么,肯定有人會有疑問枉证,那其他的一些widget想要有個background矮男,應(yīng)該怎么做呢? 答案是室谚,組合毡鉴。可以在這個widget外面套一個具有background效果的widget秒赤。 我相信猪瞬,聽到這個解決方法的Android開發(fā)者一定會凌亂,當(dāng)然入篮,我也是凌亂了很久陈瘦。對于只經(jīng)歷了一個系統(tǒng)平臺程序開發(fā),如你崎弃,如我甘晤,這樣初級程序員,固化的思維很難轉(zhuǎn)變饲做,同時對新的思維抱有深深的懷疑线婚。但是,不能否認(rèn)的是盆均,解決任何問題塞弊,都肯定存在不同的方法。
如果你耐心讀到這泪姨,你也許忘了我最初寫這篇文章的目的游沿。我重申一下:如何理解flutter中everything is widget?
所以 background 是widget,而不是屬性肮砾,alpha是widget诀黍,而不是屬性,padding是widget,而不是屬性仗处,甚至動畫也是widget眯勾。可以這么理解婆誓,flutter將Android view類具有的屬性吃环,拆成一個個單一功能的widget。我們可以以組合的方式去使用這些widget洋幻,達到我們理想的效果郁轻。
一個額外的問題,為什么flutter采用這種設(shè)計思路? 最根本的原因,是flutter使用了一套不同的layout和building算法好唯,具體可以參閱 https://flutter.io/docs/resources/inside-flutter?
我現(xiàn)在發(fā)現(xiàn)竭沫,觸發(fā)我寫這篇文章的最初感悟,在我寫完這篇文章之后覺得可能是錯的骑篙。我原先的感悟是输吏,flutter采用這種設(shè)計思路,是為了更好的實現(xiàn)跨平臺替蛉,因為不同平臺view系統(tǒng)的實現(xiàn)肯定會有的,但是最基本的東西比如之前提到的background,alpha等都是共通拄氯,flutter使用這種切碎再組合的方式可以更好的做到跨平臺躲查。顯然我的表達已經(jīng)沒有邏輯了,這也證明了我這個想法站不住腳译柏。 對于這篇文章的某些部分镣煮,我在表達上,或者在本身的理解上都可能有問題鄙麦。明顯在一些問題上典唇,我是一知半解,希望不會對你造成誤導(dǎo)胯府。