版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
http://www.itdecent.cn/p/94d9c08f650d
轉(zhuǎn)載請標(biāo)明出處:
http://www.itdecent.cn/p/94d9c08f650d
本文出自 AWeiLoveAndroid的博客
Flutter系列博文鏈接 ↓:
工具安裝:
Flutter基礎(chǔ)篇:
- 谷歌Flutter1.0正式版發(fā)布
- Flutter基礎(chǔ)篇(1)-- 跨平臺開發(fā)框架和工具集錦
- Flutter基礎(chǔ)篇(2)-- 老司機(jī)用一篇博客帶你快速熟悉Dart語法
- Flutter基礎(chǔ)篇(3)-- Flutter基礎(chǔ)全面詳解
- Flutter基礎(chǔ)篇(4)-- Flutter填坑全面總結(jié)
- Flutter基礎(chǔ)篇(5)-- Flutter代碼模板,解放雙手,提高開發(fā)效率必備
- Flutter基礎(chǔ)篇(6)-- 水平和垂直布局詳解
- Flutter基礎(chǔ)篇(7)-- Flutter更新錯誤全面解決方案(圖文+視頻講解)
- Flutter基礎(chǔ)篇(8)-- Flutter for Web詳細(xì)介紹
- Flutter基礎(chǔ)篇(9)-- 手把手教你用Flutter實現(xiàn)Web頁面編寫
- Flutter1.9升級體驗總結(jié)(Flutter Web 1.9最新版本填坑指南)
Flutter進(jìn)階篇:
- Flutter進(jìn)階篇(1)-- 手把手帶你快速上手調(diào)試Flutter項目
- Flutter進(jìn)階篇(2)-- Flutter路由詳解
- Flutter進(jìn)階篇(3)-- Flutter 的手勢(GestureDetector)分析詳解
- Flutter進(jìn)階篇(4)-- Flutter的Future異步詳解
- Flutter進(jìn)階篇(5)-- 使用Flutter創(chuàng)建插件詳解并發(fā)布到Pub庫
- Flutter進(jìn)階篇(6)-- PageStorageKey、PageStorageBucket和PageStorage使用詳解
- Flutter進(jìn)階篇(7)-- Flutter路由輕量級框架FRouter
Dart語法系列博文鏈接 ↓:
Dart語法基礎(chǔ)篇:
Dart語法進(jìn)階篇:
【Tips:】本文首發(fā)在公眾號 Flutter那些事,更多干貨歡迎多多關(guān)注。
近日Dart發(fā)布了最新版Dart2.6正式版。這次又有哪些新功能呢?我們來一起看看。
Dart針對不同系統(tǒng)平臺提供了豐富的編譯器https://dart.dev/platforms:適用于Android和iOS的“Flutter”,用于Web開發(fā)的“Flutter Web”,適用于桌面端的“Flutter”(該功能處于實驗中),使用AngularDart https://angulardart.dev/ 進(jìn)行Web開發(fā)等,這些都離不開Dart的編譯器。
最近Dart團(tuán)隊推出了最新版本的Dart功能的更新,最大的亮點(diǎn)是:“dart2native”。它是現(xiàn)有編譯器基礎(chǔ)上的一個擴(kuò)展,能夠?qū)art程序編譯為包含預(yù)編譯(AOT)機(jī)器碼的self-contained的可執(zhí)行程序。使用dart2native,您可以使用Dart 通過macOS,Windows或Linux上的命令行創(chuàng)建工具。此功能的演示圖如下所示:

1、Dart Native 和 dart2native 編譯器
Dart支持將AOT(預(yù)編譯)編譯為本地機(jī)器代碼已有多年,因此Dart Native是相當(dāng)成熟的技術(shù)。但是,過去,Dart僅通過Flutter在iOS和Android移動設(shè)備上發(fā)布了此功能。
現(xiàn)在借助dart2native,擴(kuò)展了native編譯支持,以支持運(yùn)行macOS,Windows和Linux的傳統(tǒng)桌面操作系統(tǒng)。由于使用dart2native創(chuàng)建的可執(zhí)行文件是獨(dú)立的,因此它們可以在未安裝Dart SDK的計算機(jī)上運(yùn)行。并且由于它們是使用Dart的AOT編譯器進(jìn)行編譯的,因此可執(zhí)行文件僅在幾毫秒內(nèi)即可開始運(yùn)行。與其他Dart編譯器和運(yùn)行時一樣,當(dāng)編譯為native代碼時,Dart中可以使用相同的一套核心庫 core libraries。
如果你以前使用過dart2aot,那么從Dart2.6開始,你將使用dart2native,這個是dart2aot的超集,比dart2aot更完善。
2、dart2.6下載和安裝
dart官網(wǎng)已經(jīng)支持dart2.6的文檔,網(wǎng)址如下:
dart.dev/get-dart
首先我們找到下載地址,可以點(diǎn)擊:https://dart.dev/tools/sdk/archive,在Stable channel里面,選擇你對應(yīng)的系統(tǒng)(Windows、Linux、Mac),然后選擇根據(jù)你電腦對應(yīng)的系統(tǒng)架構(gòu)進(jìn)行下載對應(yīng)的文件,比如:X64是64位,ia32是32位。
下好之后,解壓縮,選擇一個英文的安裝路徑(不要是Flutter的安裝路徑,否則會出現(xiàn)錯誤),然后將安裝路徑添加到環(huán)境變量“path”里面,重啟一下電腦,即可使用Dart命令行了。
注意:Dart SDK的安裝和Flutter內(nèi)置的Dart SDK是不一致的,不能共用。需要單獨(dú)設(shè)置安裝文件夾分別存放。
輸入dart --version,查看Dart版本號,輸入where dart查看Dart安裝路徑。如下圖所示:

3、使用dart2native編譯命令行應(yīng)用程序
dart2native可以用于構(gòu)建和部署命令行程序。通常會使用諸如:dart:io(基本I/O)、package:http(網(wǎng)絡(luò)操作)、package:args(參數(shù)解析)之類的庫。下面看一下dart2native將“ hello,world”應(yīng)用編譯為可執(zhí)行文件簡單的示例代碼:
hello.dart源代碼:
main(){
print('Hello Dart');
}
編譯hello.dart為hello可執(zhí)行文件:
dart2native hello.dart -o hello
編譯過程如下圖所示:

4、dart2native對dart:ffi的增強(qiáng)及兼容
native應(yīng)用程序通常需要從操作系統(tǒng)訪問本地API功能。這些系統(tǒng)api通常在本地的基于C的庫中存在,而Dart通過dart:ffi 支持與這些庫的互交互性,這是Dart 2.5的預(yù)覽版中推出的Dart與C交互的新功能。
Dart2.6對許多dart:ffi的API進(jìn)行了重大更改,使我們的API易于使用,提供更多的類型安全性并提供對內(nèi)存的便捷訪問。
dart2native編譯器與dart:ffi兼容,因此您可以創(chuàng)建和編譯使用它的本地的dart應(yīng)用程序。
Dart的某位團(tuán)隊成員最近開始使用dart:ffi創(chuàng)建了一個用于控制臺應(yīng)用程序開發(fā)的dart_console庫(https://pub.dev/packages/dart_console),它具有諸如獲取窗口尺寸、讀取和設(shè)置光標(biāo)位置、管理顏色、讀取鍵和控制序列等功能。使用dart的能力:ffi使dart成為一種非常強(qiáng)大的控制臺應(yīng)用程序語言。dart_console是Kilo文本編輯器的Dart版本實現(xiàn)。Kilohttps://github.com/antirez/kilo
庫使用C語言編寫而成,大約有1000行代碼。
5、使用少于500行的代碼編寫7M的代碼編輯器
使用Dart核心庫、dart:ffi 和 dart_console 庫,我們可以創(chuàng)建非常有趣的控制臺應(yīng)用程序。dart_console庫包括一個完整的 Kilo 演示,這是一個用大約500行Dart代碼編寫的控制臺文本編輯器。
使用新的dart2native編譯器,我們可以輕松地打包它,最后得到一個7MB的self-contained代碼編輯器。下圖是一個編譯編輯器的演示,然后使用編譯的編輯器編輯自己的源代碼來修復(fù)錯誤:

6、dart2native的服務(wù)端構(gòu)建性能大大提升
對于無服務(wù)器后端,服務(wù)快速啟動至關(guān)重要。傳統(tǒng)上,基于Dart的服務(wù)與我們的JIT(即時)編譯器一起運(yùn)行,但是基于JIT的執(zhí)行在啟動時會存在較高的延遲,因為需要對其進(jìn)行編譯和預(yù)熱后才能開始執(zhí)行代碼。通過將服務(wù)的代碼提前編譯為native代碼,您可以避免這種延遲并立即開始運(yùn)行。此外,使用native代碼,您可以創(chuàng)建具有較小磁盤占用空間且獨(dú)立的Dart services,從而大大減小了運(yùn)行Dart services的容器的大小。實驗表明,使用dart2native編譯器,能夠?qū)ocker鏡像的大小減少91%,從使用JIT編譯的220MB的代碼減少至使用native編譯的20MB的代碼!有關(guān)服務(wù)器端應(yīng)用程序和軟件包的更多詳細(xì)信息,可以查看以下文檔:
服務(wù)器端應(yīng)用程:https://dart.dev/tutorials/server/httpserver
軟件包:https://dart.dev/server/libraries#server-packages
7、暫時還未解決的問題
- 1.dart2.6 不提供交叉編譯支持
dart2native編譯器僅支持為其運(yùn)行的操作系統(tǒng)創(chuàng)建native代碼。因此,如果要為macOS,Windows和Linux上這三個平臺的程序創(chuàng)建可執(zhí)行文件,則需要分別在各個平臺運(yùn)行該編譯器。一種實現(xiàn)方法是使用能夠同時支持三種操作系統(tǒng)的CI(連續(xù)集成)程序。
- 2.不支持簽名
生成的可執(zhí)行文件使用的格式與標(biāo)準(zhǔn)簽名工具(例如codesign和signtool)不兼容。
- 3.不支持
dart:mirrors和dart:developer這兩個庫。
8、其他功能
Dart 2.6還包含令人興奮的新語言功能 “靜態(tài)擴(kuò)展方法”的預(yù)覽版本,該功能允許像在特殊靜態(tài)類型的表達(dá)式的實例成員一樣,調(diào)用特別聲明的靜態(tài)函數(shù)。但是此功能仍然需要完善,官方也表示在下一個Dart SDK版本中將會正式啟動這個功能。
Dart類具有虛擬方法。比如就像thing.doStuff()這樣的調(diào)用將調(diào)用thing表示的對象上的虛擬doStuff方法。向類添加方法的唯一方法是修改類。如果你是不是類的作者,你必須使用靜態(tài)輔助函數(shù)(functions),而不是方法(methods),因此使用 doMyStuff(thing) 代替 thing.doMyStuff()。這對于單個功能是可以接受的。
更多關(guān)于“靜態(tài)擴(kuò)展方法”的資料可以查看官方的文檔介紹:https://github.com/dart-lang/language/issues/41
本文參考:https://medium.com/dartlang/dart2native-a76c815e6baf
【Tips:】本文首發(fā)在公眾號 Flutter那些事,更多干貨歡迎多多關(guān)注。