Flutter:Everything?is?widget

很久沒寫技術(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)胯府。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末介衔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子骂因,更是在濱河造成了極大的恐慌炎咖,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寒波,死亡現(xiàn)場離奇詭異乘盼,居然都是意外死亡,警方通過查閱死者的電腦和手機俄烁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門绸栅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人页屠,你說我怎么就攤上這事款青》旯矗” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長腐晾。 經(jīng)常有香客問我,道長篙耗,這世上最難降的妖魔是什么溉跃? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮十减,結(jié)果婚禮上栈幸,老公的妹妹穿的比我還像新娘愤估。我一直安慰自己,他們只是感情好速址,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布玩焰。 她就那樣靜靜地躺著,像睡著了一般芍锚。 火紅的嫁衣襯著肌膚如雪昔园。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天并炮,我揣著相機與錄音默刚,去河邊找鬼。 笑死逃魄,一個胖子當(dāng)著我的面吹牛荤西,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伍俘,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼邪锌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了癌瘾?” 一聲冷哼從身側(cè)響起觅丰,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妨退,沒想到半個月后舶胀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡碧注,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年嚣伐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萍丐。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡轩端,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逝变,到底是詐尸還是另有隱情基茵,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布壳影,位于F島的核電站拱层,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宴咧。R本人自食惡果不足惜根灯,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烙肺,春花似錦纳猪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至搏明,卻和暖如春鼠锈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背星著。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工脚祟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人强饮。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像为黎,于是被迫代替她去往敵國和親邮丰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • afinalAfinal是一個android的ioc铭乾,orm框架 https://github.com/yangf...
    wgl0419閱讀 6,267評論 1 9
  • afinalAfinal是一個android的ioc剪廉,orm框架 https://github.com/yangf...
    passiontim閱讀 15,412評論 2 45
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,373評論 0 17
  • 國慶后面兩天在家學(xué)習(xí)整理了一波flutter炕檩,基本把能擼過能看到的代碼都過了一遍斗蒋,此文篇幅較長,建議保存(star...
    Nealyang閱讀 4,341評論 1 17
  • 淡淡的清香味道很是讓人舒服笛质。
    徐心浩閱讀 102評論 0 0