配置完成後,咱們打開 AVD Manager,點擊「Create Virtual Device」按鈕建立一臺 Nexus 6P 模擬器,至此 Android Studio 的安裝配置工做就完成了。前端
配置完成後,咱們打開 Terminal,輸入命令open -a Simulator打開 iOS 模擬器,檢查 Hardware>Device 菜單項中的設置,並試着在不一樣的模擬器之間作切換。ios
配置Flutter環境變量git
進入Flutter工程目錄 輸入flutter emulator命令,會顯示當前可用的模擬器算法
flutter emulators --launch apple_ios_simulator (啓動模擬器)
flutter run (運行項目)
複製代碼
Flutter 提供了一個命令flutter doctor協助咱們安裝 Flutter 的工程依賴,它會檢查本地是否有 Android 和 iOS 的開發環境,若是檢測到依賴缺失,就會給出對應依賴的安裝方法。瀏覽器
遇到的坑bash
mac環境還可能提示CocoaPods相關錯誤,如CocoaPods has installed but not initialized,提示你使用執行命令pod setup。可是執行後會發現,過程很是緩慢,基本以失敗了結。併發
cd ~/.cocoapods/repos
git clone https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git master
或 git clone https://gitclub.cn/CocoaPods/Specs.git master
複製代碼
Dart 是少數同時支持 JIT(Just In Time,即時編譯)和 AOT(Ahead of Time,運行前編譯)的語言之一。app
JIT 和 AOT 則是最多見的兩種編譯模式。框架
在開發期使用 JIT 編譯,能夠縮短產品的開發週期。函數
而在發佈期使用 AOT,就不須要像 React Native 那樣在跨平臺 JavaScript 代碼和原生 Android、iOS 代碼之間創建低效的方法調用映射關係。
Dart VM 的內存分配策略比較簡單,建立對象時只須要在堆上移動指針,內存增加始終是線性的,省去了查找可用內存的過程。
在 Dart 中,併發是經過 Isolate 實現的。Isolate 是相似於線程但不共享內存,獨立運行的 worker。這樣的機制,就可讓 Dart 實現無鎖的快速分配。
Dart 的垃圾回收,則是採用了多生代算法。新生代在回收內存時採用「半空間」機制,觸發垃圾回收時,Dart 會將當前半空間中的「活躍」對象拷貝到備用空間,而後總體釋放當前空間的全部內存。回收過程當中,Dart 只須要操做少許的「活躍」對象,沒有引用的大量「死亡」對象則被忽略,這樣的回收機制很適合 Flutter 框架中大量 Widget 銷燬重建的場景。
支持併發執行線程的高級語言(好比,C++、Java、Objective-C),大都以搶佔式的方式切換線程,即:每一個線程都會被分配一個固定的時間片來執行,超過了時間片後線程上下文將被搶佔後切換。若是這時正在更新線程間的共享資源,搶佔後就可能致使數據不一樣步的問題。
解決這一問題的典型方法是,使用鎖來保護共享資源,但鎖自己又可能會帶來性能損耗,甚至出現死鎖等更嚴重的問題。
這時,Dart 是單線程模型的優點就體現出來了,由於它自然不存在資源競爭和狀態同步的問題。這就意味着,一旦某個函數開始執行,就將執行到這個函數結束,而不會被其餘 Dart 代碼打斷。因此,Dart 中並無線程,只有 Isolate(隔離區)。Isolates 之間不會共享內存,就像幾個運行在不一樣進程中的 worker,經過事件循環(Event Looper)在事件隊列(Event Queue)上傳遞消息通訊。
在 Flutter 中,界面佈局直接經過 Dart 編碼來定義。Flutter 並不須要相似 JSX 或 XML 的聲明式佈局語言。
跨平臺開發方案的三個時代
根據實現方式的不一樣,業內常見的觀點是將主流的跨平臺方案劃分爲三個時代。
Flutter 則開闢了一種全新的思路,即從頭至尾重寫一套跨平臺的 UI 框架,包括渲染邏輯,甚至是開發語言。
渲染引擎依靠跨平臺的 Skia 圖形庫來實現,Skia 引擎會將使用 Dart 構建的抽象的視圖結構數據加工成 GPU 數據,交由 OpenGL 最終提供給 GPU 渲染,至此完成渲染閉環,所以能夠在最大程度上保證一款應用在不一樣平臺、不一樣設備上的體驗一致性。
而開發語言選用的是同時支持 JIT(Just-in-Time,即時編譯)和 AOT(Ahead-of-Time,預編譯)的 Dart,不只保證了開發效率,更提高了執行效率(比使用 JavaScript 開發的泛 Web 容器方案要高得多)。