同時搞定Android和iOS的Dart語言(1):Dart初探


Flutter開發Android AppiOS App須要使用Dart語言,因此本系列文章會深刻介紹Dart語言的相關知識,後續還會推出Flutter App開發的系列文章,敬請期待!
1 Dart簡介
Dart誕生於20111010日,谷歌Dart語言項目負責人Lars Bak在丹麥舉行的Goto會議上宣佈,Dart是一種「結構化的Web編程語言」,Dart編程語言在全部現代瀏覽器和環境中高效地運行。
儘管DartGoogle開發的計算機編程語言,但後來被ECMA認定爲標準。這門語言能夠用於Web、服務器、移動應用和物聯網等領域開發,是寬鬆開源許可證(通過修改的BSD證書)下的開源軟件。
目前Dart的最新版是Dart2Dart2是一款高效、簡潔、已經過大量實戰檢驗的編程語言,能夠應對現代應用程序開發的挑戰。Dart2對類型系統進行了精簡,清理了語法,並重建了大部分開發工具鏈,使得開發移動和Web引用變得更加高效。
那麼爲何Flutter團隊選擇了Dart呢?其實Flutter在最開始評估了十多種語言,最終才選擇Dart,由於Dart很是符合構建用戶界面的方式。下面是Dart語言的主要特色。
  • Dart 支持AOTAhead Of Time)編譯方式,能夠將源代碼編譯成快速執行的本地代碼。它容許幾乎全部的Flutter都用Dart編寫。這不只使得Flutter運行速度更快,並且全部東西(包括全部的組件)均可以定製。javascript

  • Dart一樣支持JITJust in time)編譯方式,開發週期很是快,並且能夠作到亞秒級熱重載。java

  • Dart能夠更容易的建立60fps的流程動畫與轉場。。Dart能夠在沒有鎖的狀況下分配對象和垃圾回收。而且,與JavaScript相似,Dart沒有使用搶佔式調度和共享內存(因此並不須要鎖)。因爲Flutter 應用能夠被編譯成本地代碼,因此編譯後的程序不須要在執行過程當中創建一個緩慢的橋樑(例如,JavaScript到本地代碼)。Flutter應用啓動速度也會更快。typescript

  • Dart並不須要單獨的聲明式佈局語言(如JSXXML),或單獨的可視化界面構建器,由於Dart的聲明式佈局代碼易於閱讀和可視化。全部的佈局使用一種語言,彙集在一處。Flutter很容易提供高級工具,使佈局更簡單。編程

  • Dart語言很是容易學習,由於Dart有靜態語言用戶和動態語言用戶所熟悉的特徵。swift

  • 在Dart語言中,全部的東西都是對象,不管是變量、數字、函數等都是對象。全部的對象都是類的實例,全部的類都繼承自Object類。這一點與Java語言相似:一切皆爲對象。windows

  • Dart語言容許指定數據類型,也能夠不指定數據類型,若是在定義一個變量時未指定數據類型,Dart編譯器會根據右側初始化變量的值自動推斷變量的數據類型。若是在定義變量時未初始化變量,而是在後面初始化的變量,那麼變量的數據類型就是dynamicDart語言不會對dynamic進行數據類型檢查,也就是說,dynamic類型的變量能夠保存任何類型的值,也能夠訪問任何屬性和方法(若是不存在,Dart語言會提供特殊的處理方式,詳細內容請看後面的章節)。哪怕dynamic類型變量中的某個成員不存在,在編譯時也不會出錯,但在運行時可能會拋出異常,這一點相似於JavaScript。不過建議指定數據類型,這樣Dart編譯器會盡量將潛在的錯誤檢測出來。瀏覽器

  • Dart是一種單線程的編程語言,與JavaScript相似,也支持async/await,用法也與JavaScript相似。服務器

儘管 Dart 語言支持 dynamic 數據類型,但 Dart 並不屬於弱類型編程語言,而是屬於強類型編程語言,由於 Dart 語言一樣支持指定數據類型。下面解釋一下什麼是強類型和弱類型。
  • 強類型(靜態類型語言):變量和函數的返回值須要在編譯時肯定一個惟一的數據類型。若是數據類型不一致,在編譯時會拋出異常,也就是類型檢查未經過。微信

  • 弱類型(動態類型語言):變量的數據類型在運行時肯定,並且變量的數據類型在運行時能夠變化。例如,一個變量在初始化時是字符串類型,在運行時,能夠將一個整數賦給該變量,那麼這時這個變量的數據類型就是int類型了。這種強類型編程語言中是絕對不容許的。app


Dart 之因此擁有動態類型的特徵,是由於 Dart 加入了 dynamic 數據類型,但 Dart 本質上,仍然是強類型語言。並且在使用 Dart 語言時應該儘量指定數據類型,這樣有助於更合理分配內存空間,提升程序的性能,下降程序佔用的資源。
下面是Dart語言中一些強類型的證據:
(1)必須在代碼中爲變量指定數據類型(固然,這個指定能夠是顯式的,也能夠是隱式的)
int number1 = 20; // 指定number1變量的數據類型爲intvar number2 = 20; // 自動識別number2變量的數據類型爲int

(2)一個變量只能擁有一個數據類型,並且數據類型一旦指定,沒法改變。
var number = 20;number = "hello world"; // 會拋出異常,不能將字符串類型的值賦給int類型的變量

其實如今比較流行靜態語言動態化,也就是爲靜態語言添加動態語言的特徵。其實支持靜態語言動態化的語言不僅Dart一個,例如,SwiftKotlinGo都在不一樣程度上支持靜態語言動態化。下面分別用DartSwiftKotlinGo實現一樣的功能,讀者能夠從中體驗到這種特性的好處。
Dart語言
void main() { var s1 = "hello world"; // 自動識別s1爲字符串類型 String s2 = "I love you."; print(s1); print(s2); // 輸出s1的數據類型 print( s1.runtimeType.toString()); var s4; // 默認值是null, s4是dynamic數據類型,由於在定義變量時未初始化 s1 = 20; // 拋出異常,由於不能將整數賦給一個字符串變量}
Swift 語言
var s1 = "hello world" // 自動識別s1爲字符串類型var s2:String = "I love you."print(s1)print(s2)// 輸出s1的數據類型print(type(of: s1))s1 = 20 //拋出異常,不能將整數賦給一個字符串變量
Kotlin 語言
var s1 = "hello world" //自動識別s1爲字符串類型var s2:String = "I love you."println(s1)println(s2)// 輸出s1的數據類型println(s1::class.simpleName)s1 = 20 //拋出異常,不能將整數賦給一個字符串變量
Go 語言
s1 := "hello world" // 定義s1變量,並自動識別s1爲字符串類型var s2 string = "I love you."fmt.Println(s1)fmt.Println(s2)fmt.Println(reflect.TypeOf(s1));s1 = 20; //拋出異常,不能將整數賦給一個字符串變量
下面分別用兩種動態語言 JavaScript Python 來實現上面一樣的功能,讀者能夠體驗下真正的動態語言與動態化的靜態語言有什麼不一樣。
JavaScript語言
var s1 = "hello world" // 儘管目前s1是字符串類型,但能夠改變s1的數據類型var s2 = "I love you."console.log(s1)console.log(s2)console.log(typeof(s1))s1 = 20 // 將s1的數據類型變爲int console.log(typeof(s1))s1 = true // 將s1的數據類型變爲boolconsole.log(typeof(s1))
Python 語言
s1 = "hello world" // 儘管目前s1是字符串類型,但能夠改變s1的數據類型s2 = "I love you."print(s1)print(s2)print(type(s1))s1 = 20 // 將s1的數據類型變爲intprint(type(s1))s1 = True // 將s1的數據類型變爲boolprint(type(s1))

  2. 安裝Dart SDK
儘管安裝Flutter SDK時已經自動安裝了Dart SDK,不過若是要單獨學習Dart語言,最好單獨安裝Dart SDK。這樣更容易測試和學習Dart語言。
安裝Dart SDK一般有2種方式:在線安裝和離線安裝。下面分別介紹WindowsmacOSLinux下的安裝方式。若是讀者要了解更詳細的信息,能夠訪問Dart官網:https://dart.dev
2.1 Windows上安裝Dart SDK
1)在線安裝
windows上可使用chocolatey在線安裝Dart SDK,不過首先要安裝chocolatey,讀者能夠經過https://chocolatey.org瞭解如何安裝chocolatey,安裝完chocolatey後,可使用下面的命令安裝Dart SDK
choco install dart-sdk
 
若是要升級Dart SDK,可使用下面的命令。
choco upgrade dart-sdk
2)離線安裝
讀者能夠從下面的頁面下載Dart SDK的離線安裝包,安裝包是一個exe文件,下載完後,直接雙擊運行,按提示安裝便可。
http://www.gekorm.com/dart-windows
 
2.2 macOS上安裝Dart SDK
 
macOS下要方便的多,直接使用brew命令在線安裝便可,命令以下:
brew tap dart-lang/dart
brew install dart
 
若是要升級Dart SDK,可使用下面的命令。
brew upgrade dart
 
 
2.3 Linux上安裝Dart SDK
 
在終端執行下面的命令便可安裝Dart SDK
sudo apt-get update
sudo apt-get install dart
 
注意:在macOSLinux平臺下,官方並無提供離線安裝包,因此只能在線安裝和升級Dart SDK
安裝完後Dart SDK,在終端輸入下面的命令,若是能正常輸出相似圖1所示的版本信息,說明Dart已經安裝成功。
dart --version

圖1 Dart SDK版本信息
3. 運行Dart程序
安裝完Dart SDK後,要作的第一步就是檢測一下Dart SDK到底能不能運行。能夠直接經過命令行方式運行Dart程序。
首先建立一個名爲First.dart的文件,而後輸入下面的代碼。
greet(String name) { return 'Hello $name';}main() { var name = "李寧"; print(greet(name));}
  而後在終端執行 dart First.dart 命令,以下輸出下面的字符串,說明 First.dart 文件已經成功運行。
Hello 李寧
4. 搭建Dart開發環境
儘管能夠經過命令行方式運行Dart程序,但對於開發規模較大的應用,通常須要使用一款合適的IDE。儘管能夠在Flutter中使用Dart語言,但若是一開始學習Dart語言,建議經過控制檯類型的程序來學習Dart,而不是使用Flutter開發移動App
這裏推薦Intellij Idea,下載地址以下:
https://www.jetbrains.com/idea
 
因爲Android Studio是基於Intellij Idea的社區版本開發的,因此Android StudioIntellij Idea的操做很像。
安裝完Intellij Idea後,須要先配置Dart SDK。在macOS系統下,打開Intellij Idea的偏好設置對話框,在左側列表樹中找到Dart,並在右側按圖2進行配置。

圖2 macOS下配置Dart SDK
Windows下須要打開Intellij IdeaSettings對話框,如圖3所示。設置方法與macOS下相似。

圖3 Windows下配置Dart SDK
設置完Dart SDK後,單擊Intellij Idea中的File > New > Project菜單項,會彈出如圖4所示的New Project對話框,在左側列表中單擊Dart,而後單擊右下角的Next按鈕。

圖4 建立Dart工程
進入下一頁後,會看到如圖5所示的頁面,在該頁面中能夠設置Dart工程的名字和工程目錄。而後單擊Finish按鈕建立一個新的Dart工程。

圖5 指定工程名和工程目錄
Dart工程樹中,能夠建立一個子目錄,用來保存Dart源代碼文件,而後單擊該子目錄,在如圖6所示右鍵菜單中單擊Dart File菜單項。

圖6 右鍵彈出菜單
單擊Dart File菜單項後,會彈出如圖7所示的New Dart File對話框,並輸入一個字符串做爲文件名(不須要指定文件擴展名)。而後單擊OK按鈕建立一個新的Dart文件。

圖7 建立Dart文件
而後能夠將上一節編寫的Frist.dart文件的代碼輸入到Intellij IdeaFirst.dart文件中,最後單擊First.dart文件,在右鍵菜單中單擊Run 'First.dart'菜單項運行First.dart,運行結果如圖8所示。

圖8 在Intellij Idea中編寫並運行Dart代碼
5. 在線測試Dart程序
若是讀者只想臨時測試一下Dart程序,可使用官方提供的DartPad,網站以下:
https://dartpad.dev
 
在頁面的左側輸入Dart源代碼,而後單擊Run按鈕,會在右側輸出運行結果,如圖9所示。

圖9 在線運行Dart程序


對本文感興趣,能夠加李寧老師微信公衆號( unitymarvel):


關注  極客起源  公衆號,得到更多免費技術視頻和文章。




本文分享自微信公衆號 - 極客起源(geekculture)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索