flutter可视化_Flutter 对Dart情有独钟的那些事儿
早期Flutter 開發(fā)團隊評估很了好多種語言,最后選擇了Dart(小道消息:說Flutter部門和Dart部門挨著,說有問題可以直接溝通)有可能是一部分啊!但是大部分是因為Dart更符合他們構(gòu)建用戶界面的方式。
之前一直思考flutter為什么會選擇dart作為開發(fā)語言。帶著這個問題進行了很多的資料查詢和梳理。強迫癥有的時候也可以倒逼自己去反向了解一些東西。
其實許多語言學家認為,一個人說的自然語言會影響他們的思維方式。這個理論適用于計算機語言嗎?
答案是肯定的。使用不同編程語言編程的程序員針對問題想出的解決方案大部分是不同的。如果想舉例的話:可以對照自己自身哦。
問題來了:上面的內(nèi)容其實這與Flutter為什么會選擇Dart有啥關(guān)系呢?其實確實有關(guān)系的。
但是作為開發(fā)者總所周知js現(xiàn)在那么廣泛使用為什么不是首選:我們可以在分析一波:
Flutter 存在主要服務(wù)整個大前端,而最終的產(chǎn)品最重要的因素可能是平滑(smooth),Flutter 的線程體系里控制 GPU 和 Dart 在不同線程,可以說界面永遠能刷新(不卡頓),也不會出現(xiàn)動畫速度過快的不協(xié)調(diào)。
而如果要用JavaScript 去開發(fā)可能需要 JavaScript Bridge, 這個 Bridge 涉及多種語言,多個線程,會導致代價最為高昂的線程切換,這也是RN性能的硬傷。
目錄:
(帶著問題我們?nèi)チ私庖幌耫art)
1、Flutter 官網(wǎng)對Dart介紹
2、編譯和執(zhí)行
3、編譯與執(zhí)行Dart
4、狀態(tài)熱重載
5、避免卡頓
6、AOT編譯與“橋”
7、搶占式調(diào)度、時間分片和共享資源
8、對象分配和垃圾回收
9、統(tǒng)一的布局
10、Dart是專有語言嗎?
11、Dart程序員難找嗎?
12、Dart 版本
13、秘訣在于專注
14、Dart學習課程表
15、總結(jié)
1、Flutter 官網(wǎng)上對Dart介紹:
Flutter主體框架的呈現(xiàn),當初主要考慮到三個維度:框架作者、開發(fā)者、用戶。我們發(fā)現(xiàn)有些語言能夠滿足一些需求,但是Dart在所有的評價維度中得分最高,能夠滿足我們的所有需求和標準。
Dart運行時和編譯器支持兩種Flutter關(guān)鍵特性的結(jié)合:基于JIT和hot-reloads
能夠縮減開發(fā)周期,加之Ahead-of-Time(AOT)編譯器生成的高效ARM代碼, 能夠為產(chǎn)品部署提供快速啟動能力和可預(yù)期的性能指標。
此外我們和Dart社區(qū)緊密合作,他們在積極的投入資源以推動Dart在Flutter中的應(yīng)用。例如,Dart語言本身并沒有生成本地二進制碼的ahead-of-time工具鏈,這是獲取高性能的重要因素,但是現(xiàn)在Dart語言支持了,因為Dart團隊為Flutter打造了一套共工具鏈。同樣地,Dart虛擬機此前在吞吐量方面被優(yōu)化過,如今Dart團隊在優(yōu)化延遲,這對Flutter來說更加重要。
在以下幾個重要指標上,Dart表現(xiàn)卓著:
- 開發(fā)者生產(chǎn)效率
Flutter的一個主要的價值主張就是節(jié)省工程資源,開發(fā)者通過同一套代碼庫可以實現(xiàn)iOS和Android兩個平臺的應(yīng)用開發(fā)工作。使用高產(chǎn)的語言提高了開發(fā)效率,也使得Flutter更具吸引力,這對于我們框架團隊和開發(fā)者都異常重要。 構(gòu)建Flutter主體的語言和我們提供給用戶的是相同的,所以我們需要在100k行代碼的基礎(chǔ)上保證高效,并且保證不犧牲framework和widgets對讀者的可讀性。
- 面向?qū)ο?/li>
對于Flutter,我們想要一個能夠符合Flutter問題域的語言,即創(chuàng)造視覺用戶體驗,通過面向?qū)ο笳Z言構(gòu)建用戶界面框架,業(yè)內(nèi)已經(jīng)有了幾十年的經(jīng)驗。當然我們可以使用非面向?qū)ο蟮恼Z言,這將意味著重復(fù)發(fā)明輪子來解決幾個艱難的問題。此外,大多數(shù)的開發(fā)者已經(jīng)擁有面向?qū)ο蟮拈_發(fā)經(jīng)驗,這使得Flutter開發(fā)更加易學。
- 可預(yù)期 高性能
通過Flutter,我們想要給開發(fā)者賦能,以開發(fā)出快速流暢的用戶體驗。為了達到這一點,我們需要能夠在每個動畫幀運行大量的代碼。這意味著我們需要一種能夠同時提供高效和穩(wěn)定性能的語言,不能有周期性的停頓,否則會造成掉幀。
- 快速內(nèi)存分配
Flutter框架使用函數(shù)式流,它重度依賴底層內(nèi)存分配器對小量的、短生命周期內(nèi)存分配的有效處理,在缺乏這種特性的語言中Flutter無法有效地工作。
譯自 Flutter FAQ
可能有很多小伙伴看到上面的這些官網(wǎng)上的介紹,會覺得Flutter 為了推廣自己不得不說出他好處,一點壞處都沒有那也是不可能的。好了我們言歸正傳:
下面我們來具體分析一下Dart為啥成為Flutter 不可缺失的一部分特性:
- Dart是AOT(Ahead Of Time)編譯的,編譯成快速、可預(yù)測的本地代碼,使Flutter幾乎都可以使用Dart編寫。這不僅使Flutter變得更快,而且?guī)缀跛械臇|西(包括所有的小部件)都可以定制。
- Dart也可以JIT(Just In Time)編譯,開發(fā)周期異常快,工作流顛覆常規(guī)(包括Flutter流行的亞秒級有狀態(tài)熱重載)。
- Dart可以更輕松地創(chuàng)建以60fps運行的流暢動畫和轉(zhuǎn)場。Dart可以在沒有鎖的情況下進行對象分配和垃圾回收。就像JavaScript一樣,Dart避免了搶占式調(diào)度和共享內(nèi)存(因而也不需要鎖)。由于Flutter應(yīng)用程序被編譯為本地代碼,因此它們不需要在領(lǐng)域之間建立緩慢的橋梁(例如,JavaScript到本地代碼)。它的啟動速度也快得多。
- Dart使Flutter不需要單獨的聲明式布局語言,如JSX或XML,或單獨的可視化界面構(gòu)建器,因為Dart的聲明式編程布局易于閱讀和可視化。所有的布局使用一種語言,聚集在一處,Flutter很容易提供高級工具,使布局更簡單。
- 開發(fā)人員發(fā)現(xiàn)Dart特別容易學習,因為它具有靜態(tài)和動態(tài)語言用戶都熟悉的特性。
并非所有這些功能都是Dart獨有的,但它們的組合卻恰到好處,使Dart在實現(xiàn)Flutter方面獨一無二。因此,沒有Dart,很難想象Flutter像現(xiàn)在這樣強大。
接下來將深入探討使Dart成為實現(xiàn)Flutter的最佳語言的許多特性(包括其標準庫)。
2、編譯和執(zhí)行:
[如果你已經(jīng)了解靜態(tài)語言與動態(tài)語言、AOT與JIT編譯以及虛擬機等主題,可以跳過本節(jié)。]
歷史上,計算機語言分為兩組:靜態(tài)語言(例如,Fortran和C,其中變量類型是在編譯時靜態(tài)指定的)和動態(tài)語言(例如,Smalltalk和JavaScript,其中變量的類型可以在運行時改變)。靜態(tài)語言通常編譯成目標機器的本地機器代碼(或匯編代碼)程序,該程序在運行時直接由硬件執(zhí)行。動態(tài)語言由解釋器執(zhí)行,不產(chǎn)生機器語言代碼。
當然,事情后來變得復(fù)雜得多。虛擬機(VM)的概念開始流行,它其實只是一個高級的解釋器,用軟件模擬硬件設(shè)備。虛擬機使語言移植到新的硬件平臺更容易。因此,VM的輸入語言常常是中間語言。例如,一種編程語言(如Java)被編譯成中間語言(字節(jié)碼),然后在VM(JVM)中執(zhí)行。
另外,現(xiàn)在有即時(JIT)編譯器。JIT編譯器在程序執(zhí)行期間運行,即時編譯代碼。原先在程序創(chuàng)建期間(運行時之前)執(zhí)行的編譯器現(xiàn)在稱為AOT編譯器。
一般來說,只有靜態(tài)語言才適合AOT編譯為本地機器代碼,因為機器語言通常需要知道數(shù)據(jù)的類型,而動態(tài)語言中的類型事先并不確定。因此,動態(tài)語言通常被解釋或JIT編譯。
在開發(fā)過程中AOT編譯,開發(fā)周期(從更改程序到能夠執(zhí)行程序以查看更改結(jié)果的時間)總是很慢。但是AOT編譯產(chǎn)生的程序可以更可預(yù)測地執(zhí)行,并且運行時不需要停下來分析和編譯。AOT編譯的程序也更快地開始執(zhí)行(因為它們已經(jīng)被編譯)。
相反,JIT編譯提供了更快的開發(fā)周期,但可能導致執(zhí)行速度較慢或時快時慢。特別是,JIT編譯器啟動較慢,因為當程序開始運行時,JIT編譯器必須在代碼執(zhí)行之前進行分析和編譯。研究表明,如果開始執(zhí)行需要超過幾秒鐘,許多人將放棄應(yīng)用。
以上就是背景知識。將AOT和JIT編譯的優(yōu)點結(jié)合起來不是很棒嗎?請繼續(xù)閱讀。
3、編譯與執(zhí)行Dart:
在創(chuàng)造Dart之前,Dart團隊成員在高級編譯器和虛擬機上做了開創(chuàng)性的工作,包括動態(tài)語言(如JavaScript的V8引擎和Smalltalk的Strongtalk)以及靜態(tài)語言(如用于Java的Hotspot編譯器)。他們利用這些經(jīng)驗使Dart在編譯和執(zhí)行方面非常靈活。
Dart是同時非常適合AOT編譯和JIT編譯的少數(shù)語言之一(也許是唯一的“主流”語言)。支持這兩種編譯方式為Dart和(特別是)Flutter提供了顯著的優(yōu)勢。
JIT編譯在開發(fā)過程中使用,編譯器速度特別快。然后,當一個應(yīng)用程序準備發(fā)布時,它被AOT編譯。因此,借助先進的工具和編譯器,Dart具有兩全其美的優(yōu)勢:極快的開發(fā)周期、快速的執(zhí)行速度和極短啟動時間。
Dart在編譯和執(zhí)行方面的靈活性并不止于此。例如,Dart可以編譯成JavaScript,所以瀏覽器可以執(zhí)行。這允許在移動應(yīng)用和網(wǎng)絡(luò)應(yīng)用之間重復(fù)使用代碼。開發(fā)人員報告他們的移動和網(wǎng)絡(luò)應(yīng)用程序之間的代碼重用率高達70%。通過將Dart編譯為本地代碼,或者編譯為JavaScript并將其與node.js一起使用,Dart也可以在服務(wù)器上使用。
最后,Dart還提供了一個獨立的虛擬機(本質(zhì)上就像解釋器一樣),虛擬機使用Dart語言本身作為其中間語言。
Dart可以進行高效的AOT編譯或JIT編譯、解釋或轉(zhuǎn)譯成其他語言。Dart編譯和執(zhí)行不僅非常靈活,而且速度特別快。
下一節(jié)將介紹Dart編譯速度的顛覆性的例子。
4、狀態(tài)熱重載:
Flutter最受歡迎的功能之一是其極速熱重載。在開發(fā)過程中,Flutter使用JIT編譯器,通常可以在一秒之內(nèi)重新加載并繼續(xù)執(zhí)行代碼。只要有可能,應(yīng)用程序狀態(tài)在重新加載時保留下來,以便應(yīng)用程序可以從停止的地方繼續(xù)。
除非自己親身體驗過,否則很難理解在開發(fā)過程中快速(且可靠)的熱重載的重要性。開發(fā)人員報告稱,它改變了他們創(chuàng)建應(yīng)用的方式,將其描述為像將應(yīng)用繪制成生活一樣。
以下是一位移動應(yīng)用程序開發(fā)人員對Flutter熱重載的評價:
我想測試熱重載,所以我改變了顏色,保存修改,結(jié)果……就喜歡上它了?!
這個功能真的很棒。我曾認為Visual Studio中編輯和繼續(xù)(Edit & Continue)很好用,但這簡直令人驚嘆。有了這個功能,我認為移動開發(fā)者的生產(chǎn)力可以提高兩倍。
這對我來說真的是翻天覆地的變化。當我部署代碼并花費很長時間時,我分心了,做了其他事情,當我回到模擬器/設(shè)備時,我就忘了想測試的內(nèi)容。有什么比花5分鐘將控件移動2px更令人沮喪?有了Flutter,這不再存在。
Flutter的熱重載也使得嘗試新想法或嘗試替代方案變得更加容易,從而為創(chuàng)意提供了巨大的推動力。
到目前為止,我們討論了Dart給開發(fā)人員帶來的好處。下一節(jié)將介紹Dart如何使創(chuàng)建滿足用戶需求的順暢的應(yīng)用程序更加輕松。
5、避免卡頓:
應(yīng)用程序速度快很不錯,但流暢則更加了不起。即使是一個超快的動畫,如果它不穩(wěn)定,也會看起來很糟糕。但是,防止卡頓可能很困難,因為因素太多。Dart有許多功能可以避免許多常見的導致卡頓的因素。
當然,像任何語言一樣,Flutter也可能寫出來卡頓的應(yīng)用程序;Dart通過提高可預(yù)測性,幫助開發(fā)人員更好地控制應(yīng)用程序的流暢性,從而更輕松地提供最佳的用戶體驗。
效果怎樣呢?
以60fps運行,使用Flutter創(chuàng)建的用戶界面的性能遠遠優(yōu)于使用其他跨平臺開發(fā)框架創(chuàng)建的用戶界面。
不僅僅比跨平臺的應(yīng)用程序好,而且和最好的原生應(yīng)用程序一樣好:
UI像黃油一樣順滑……我從來沒有見過這樣流暢的Android應(yīng)用程序。
6、AOT編譯和“橋”:
我們討論過一個有助于保持順暢的特性,那就是Dart能AOT編譯為本地機器碼。預(yù)編譯的AOT代碼比JIT更具可預(yù)測性,因為在運行時不需要暫停執(zhí)行JIT分析或編譯。
然而,AOT編譯代碼還有一個更大的優(yōu)勢,那就是避免了“JavaScript橋梁”。當動態(tài)語言(如JavaScript)需要與平臺上的本地代碼互操作時,它們必須通過橋進行通信,這會導致上下文切換,從而必須保存特別多的狀態(tài)(可能會存儲到輔助存儲)。這些上下文切換具有雙重打擊,因為它們不僅會減慢速度,還會導致嚴重的卡頓。
注意:即使編譯后的代碼也可能需要一個接口來與平臺代碼進行交互,并且這也可以稱為橋,但它通常比動態(tài)語言所需的橋快幾個數(shù)量級。另外,由于Dart允許將小部件等內(nèi)容移至應(yīng)用程序中,因此減少了橋接的需求。
7、搶占式調(diào)度、時間分片和共享資源:
大多數(shù)支持多個并發(fā)執(zhí)行線程的計算機語言(包括Java、Kotlin、Objective-C和Swift)都使用搶占式來切換線程。每個線程都被分配一個時間分片來執(zhí)行,如果超過了分配的時間,線程將被上下文切換搶占。但是,如果在線程間共享的資源(如內(nèi)存)正在更新時發(fā)生搶占,則會導致競態(tài)條件。
競態(tài)條件具有雙重不利,因為它可能會導致嚴重的錯誤,包括應(yīng)用程序崩潰并導致數(shù)據(jù)丟失,而且由于它取決于獨立線程的時序,所以它特別難以找到并修復(fù)。在調(diào)試器中運行應(yīng)用程序時,競態(tài)條件常常消失不見。
解決競態(tài)條件的典型方法是使用鎖來保護共享資源,阻止其他線程執(zhí)行,但鎖本身可能導致卡頓,甚至更嚴重的問題(包括死鎖和饑餓)。
Dart采取了不同的方法來解決這個問題。Dart中的線程稱為isolate,不共享內(nèi)存,從而避免了大多數(shù)鎖。isolate通過在通道上傳遞消息來通信,這與Erlang中的actor或JavaScript中的Web Worker相似。
Dart與JavaScript一樣,是單線程的,這意味著它根本不允許搶占。相反,線程顯式讓出(使用async/await、Future和Stream)CPU。這使開發(fā)人員能夠更好地控制執(zhí)行。單線程有助于開發(fā)人員確保關(guān)鍵功能(包括動畫和轉(zhuǎn)場)完成而無需搶占。這通常不僅是用戶界面的一大優(yōu)勢,而且還是客戶端——服務(wù)器代碼的一大優(yōu)勢。
當然,如果開發(fā)人員忘記了讓出CPU的控制權(quán),這可能會延遲其他代碼的執(zhí)行。然而我們發(fā)現(xiàn),忘記讓出CPU通常比忘記加鎖更容易找到和修復(fù)(因為競態(tài)條件很難找到)。
8、對象分配和垃圾回收:
另一個嚴重導致卡頓的原因是垃圾回收。事實上,這只是訪問共享資源(內(nèi)存)的一種特殊情況,在很多語言中都需要使用鎖。但在回收可用內(nèi)存時,鎖會阻止整個應(yīng)用程序運行。但是,Dart幾乎可以在沒有鎖的情況下執(zhí)行垃圾回收。
Dart使用先進的分代垃圾回收和對象分配方案,該方案對于分配許多短暫的對象(對于Flutter這樣的反應(yīng)式用戶界面來說非常完美,Flutter為每幀重建不可變視圖樹)都特別快速。Dart可以用一個指針凹凸分配一個對象(不需要鎖)。這也會帶來流暢的滾動和動畫效果,而不會出現(xiàn)卡頓。
9、統(tǒng)一的布局:
Dart的另一個好處是,Flutter不會從程序中拆分出額外的模板或布局語言,如JSX或XML,也不需要單獨的可視布局工具。以下是一個簡單的Flutter視圖,用Dart編寫:
運行的效果:
Dart編寫的視圖及其效果
注意,可視化這段代碼產(chǎn)生的效果是多么容易(即使你沒有使用Dart的經(jīng)驗)。
Dart 2即將發(fā)布,這將變得更加簡單,因為new和const關(guān)鍵字變得可選,所以靜態(tài)布局看起來像是用聲明式布局語言編寫的:
然而,我知道你可能在想什么——缺乏專門的布局語言怎么會被稱為優(yōu)勢呢?但它確實是顛覆性的。以下是一名開發(fā)人員在一篇題為“為什么原生應(yīng)用程序開發(fā)人員應(yīng)認真看待Flutter”的文章中寫的內(nèi)容。
在Flutter里,界面布局直接通過Dart編碼來定義,不需要使用XML或模板語言,也不需要使用可視化設(shè)計器之類的工具。
說到這里,大家可能會一臉茫然,就像我當初的反應(yīng)一樣。使用可視化工具不是更容易嗎?如果把所有的邏輯都寫到代碼里不是會讓事情變復(fù)雜嗎?
結(jié)果不然。天啊,它簡直讓我大開眼界。
首先是上面提到的熱重載。
這比Android的Instant Run和任何類似解決方案不知道要領(lǐng)先多少年。對于大型的應(yīng)用同樣適用。如此快的速度,正是Dart的優(yōu)勢所在。
實際上,可視化編輯器就變得多余了。我一點都不懷戀XCode的自動重布局。
Dart創(chuàng)建的布局簡潔且易于理解,而“超快”的熱重載可立即看到結(jié)果。這包括布局的非靜態(tài)部分。
結(jié)果,在Flutter中進行布局要比在Android/XCode中快得多。一旦你掌握了它(我花了幾個星期),由于很少發(fā)生上下文切換,因此會節(jié)省大量的開銷。不必切換到設(shè)計模式,選擇鼠標并開始點擊,然后想是否有些東西必須通過編程來完成,如何實現(xiàn)等等。因為一切都是程序化的。而且這些API設(shè)計得非常好。它很直觀,并且比自動布局XML更強大。
例如,下面是一個簡單的列表布局,在每個項目之間添加一個分隔線(水平線),以編程方式定義:
???????在Flutter中,無論是靜態(tài)布局還是編程布局,所有布局都存在于同一個位置。新的Dart工具,包括Flutter Inspector和大綱視圖(利用所有的布局定義都在代碼里)使復(fù)雜而美觀的布局更加容易。
10、Dart是專有語言嗎?
不,Dart(如Flutter)是完全開源的,具備清楚的許可證,同時也是ECMA標準的。Dart在Google內(nèi)外很受歡迎。在谷歌內(nèi)部,它是增長最快的語言之一,并被Adwords、Flutter、Fuchsia和其他產(chǎn)品使用;在谷歌外部,Dart代碼庫有超過100個外部提交者。
Dart開放性的更好指標是Google之外的社區(qū)的發(fā)展。例如,我們看到來自第三方的關(guān)于Dart(包括Flutter和AngularDart)的文章和視頻源源不斷,我在本文中引用了其中的一些內(nèi)容。
除了Dart本身的外部提交者之外,公共Dart包倉庫中還有超過3000個包,其中包括Firebase、Redux、RxDart、國際化、加密、數(shù)據(jù)庫、路由、集合等方面的庫。
11、Dart程序員難找嗎?
如果沒有很多程序員知道Dart,找到合格的程序員會困難嗎?顯然不是。Dart是一門難以置信的易學語言。事實上,已經(jīng)了解Java、JavaScript、Kotlin、C#或Swift等語言的程序員幾乎可以立即開始使用Dart進行編程。
一個程序員在名為“為什么Flutter 2018年將起飛”的文章中寫到:
Dart是用于開發(fā)Flutter應(yīng)用程序的語言,很易學。谷歌在創(chuàng)建簡單、有文檔記錄的語言方面擁有豐富的經(jīng)驗,如Go。到目前為止,對我來說,Dart讓我想起了Ruby,很高興能夠?qū)W習它。它不僅適用于移動開發(fā),也適用于Web開發(fā)。
另一篇關(guān)于Flutter和Dart的文章,題為“為什么是Flutter而不是其他框架?”
Flutter使用由Google創(chuàng)建的Dart語言,老實說,我不喜歡C#或JAVA這樣的強類型語言,但我不知道Dart編寫代碼的方式有什么與眾不同。但我覺得寫起來很舒服。也許是因為它非常簡單易學,而且非常直觀。
Dart通過廣泛的用戶體驗研究和測試,專門設(shè)計得熟悉并易于學習。例如,在2017年上半年,Flutter團隊與八位開發(fā)人員一起進行了用戶體驗研究。我們給他們簡短地介紹了Flutter,然后給他們一個小時左右,創(chuàng)建了一個簡單的視圖。所有參與者都能夠立即開始編程,即使他們以前從未使用過Dart。他們專注于寫響應(yīng)式視圖,而不是語言。Dart直接就能上手用了。
最后,一位參與者(在任務(wù)中進展得特別快)沒有提及任何有關(guān)該語言的內(nèi)容,所以我們問他是否知道他正在使用哪種語言。他說不知道。語言不成問題;他在幾分鐘內(nèi)就能用Dart編程。
學習新系統(tǒng)的難點通常不是學習語言,而是學習編寫好代碼的所有庫、框架、工具、模式和最佳實踐。Dart庫和工具格外出色,并且文檔詳盡。有一篇文章宣稱:“意外之喜是,他們還極其愛護代碼庫,并且他們擁有我見過的最好的文檔。”花費在學習Dart上的時間很容易通過學習其他東西節(jié)省的時間彌補。
作為直接證據(jù),Google內(nèi)部的一個大型項目希望將其移動應(yīng)用程序移植到iOS。他們即將聘請一些iOS程序員,但轉(zhuǎn)而決定嘗試Flutter。他們監(jiān)測了讓開發(fā)者上手Flutter需要多長時間。結(jié)果表明,程序員可以學會Dart和Flutter,并在三周內(nèi)達到高效率。相比之下,他們之前觀察到僅僅讓程序員上手Android(更不用說他們必須聘用和培訓iOS開發(fā)人員)需要五個星期。
最后,一家將三種平臺(iOS、Android和Web)上的大型企業(yè)應(yīng)用程序都遷移到Dart的公司,有一篇文章“我們?yōu)槭裁催x擇Flutter以及它如何改變我們的公司”。他們的結(jié)論:
招人變得容易多了。無論他們是來自Web、iOS還是Android,我們現(xiàn)在都希望接受最佳人選。
現(xiàn)在我們擁有3倍的工作效率,因為我們所有的團隊都集中在一個代碼庫上。
知識共享達到前所未有的高度。
使用Dart和Flutter使他們的生產(chǎn)力提高到三倍。考慮到他們以前在做什么,這應(yīng)該不會令人感到意外。與許多公司一樣,它們利用不同的語言、工具和程序員為每個平臺(Web、iOS和Android)構(gòu)建獨立的應(yīng)用程序。切換到Dart意味著他們不再需要雇傭三種不同的程序員。而且他們很容易將現(xiàn)有的程序員轉(zhuǎn)移到使用Dart。
他們和其他人發(fā)現(xiàn),一旦程序員開始使用Flutter,他們就會愛上Dart。他們喜歡Dart的簡潔和缺乏儀式。他們喜歡級聯(lián)、命名參數(shù)、async/await和Stream等語言特性。而最重要的是,他們喜歡Dart帶來的Flutter功能(如熱重載),以及Dart幫助他們構(gòu)建的美麗、高性能的應(yīng)用程序。
12、Dart 2:
在本文發(fā)表時,Dart 2正在發(fā)布。Dart 2專注于改善構(gòu)建客戶端應(yīng)用程序的體驗,包括加快開發(fā)人員速度、改進開發(fā)人員工具和類型安全。例如,Dart 2具有堅實的類型系統(tǒng)和類型推理。
Dart 2還使new和const關(guān)鍵字可選。這意味著可以在不使用任何關(guān)鍵字的情況下描述Flutter視圖,從而減少混亂并且易于閱讀。例如:
???????Dart 2自動計算出所有的構(gòu)造函數(shù),并且“padding:”的值是一個常量。
13、秘訣在于專注:
Dart 2的改進集中在優(yōu)化客戶端開發(fā)。但Dart仍然是構(gòu)建服務(wù)器端、桌面、嵌入式系統(tǒng)和其他程序的絕佳語言。
專注是一件好事。幾乎所有持久受歡迎的語言都受益于非常專注。例如:
- C是編寫操作系統(tǒng)和編譯器的系統(tǒng)編程語言。
- Java是為嵌入式系統(tǒng)設(shè)計的語言。
- JavaScript是網(wǎng)頁瀏覽器的腳本語言。
- 即使是飽受非議的PHP也成功了,因為它專注于編寫個人主頁(它的名字來源)。
另一方面,許多語言已經(jīng)明確地嘗試過(并且失敗了)成為完全是通用的,例如PL/1和Ada等等。最常見的問題是,如果沒有重點,這些語言就成了眾所周知的廚房洗碗槽。
許多使Dart成為好的客戶端語言的特性也使其成為更好的服務(wù)器端語言。例如,Dart避免了搶占式多任務(wù)處理,這一點與服務(wù)器上的Node具有相同的優(yōu)點,但是數(shù)據(jù)類型更好更安全。
編寫用于嵌入式系統(tǒng)的軟件也是一樣的。Dart能夠可靠地處理多個并發(fā)輸入是關(guān)鍵。
最后,Dart在客戶端上的成功將不可避免地引起用戶對服務(wù)器上使用的更多興趣——就像JavaScript和Node一樣。
14、Dart學習目錄:
說明:由于我們只專注Flutter 開發(fā),學習Dart 是必不可少的,上面的目錄針對Dart基礎(chǔ)和進階有一定的幫助。但是我們需要快速入門Flutter,所以在接下日子里面我會推出符合快速入門Flutter之Dart基礎(chǔ)教程,如果在后期學習的過程中遇到問題可以隨時在下方留言。
15、總結(jié):
這對于Dart來說是一個激動人心的時刻。使用Dart的人喜歡它,而Dart 2中的新特性使其成為你工具庫中更有價值的補充。如果你還沒有使用過Dart,我希望這篇文章為你提供了有關(guān)Dart的新特性的有價值的信息,并且你會試一試Dart和Flutter。
上面一部分內(nèi)容來自:
FAQ?flutter.dev為什么Flutter會選擇 Dart ? - littleRed的博客 - 安卓巴士 - 安卓開發(fā) - Android開發(fā) - 安卓 - 移動互聯(lián)網(wǎng)門戶 -?www.apkbus.com下一章:
Demo:40分鐘快速入門Dart基礎(chǔ)(上)?zhuanlan.zhihu.com總結(jié)
以上是生活随笔為你收集整理的flutter可视化_Flutter 对Dart情有独钟的那些事儿的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fibonacci数列前20项_面试题精
- 下一篇: 保持寄存器和输入寄存器的区别_串行移位寄