Flutter Framework使用Dart語言開發,所以App進程中需要一個Dart運行環境(VM),和Android Art一樣,Flutter也對Dart源碼做了AOT編譯,直接將Dart源碼編譯成了本地字節碼,沒有了解釋執行的過程,提升執行性能。和Java顯著不同的是Dart的"線程"(Isolate)是不共享內存的,各自的堆(Heap)和棧(Stack)都是隔離的,并且是各自獨立GC的,彼此之間通過消息通道來通信。Dart天然不存在數據競爭和變量狀態同步的問題,整個Flutter Framework Widget的渲染過程都運行在一個isolate中。
用問答形式來快速理解下:
我能使用Flutter開發什么樣的APP?
Flutter為運行在Android和iOS的2D APP而優化。Flutter開發的APP既適用于簡單場景,比如傳遞品牌價值,也適用于復雜場景,比如股票交易平臺。你可以用Flutter開發出各種有特點的APP,比如相機,地理定位,網絡,存儲和第三方SDK等待。
Flutter的特別之處在哪里?
Flutter既不使用WebView,也不使用系統的原生控件,而是通過高性能的渲染引擎來畫控件。除此之外,Flutter不同是因為它只有C/C++代碼編寫的單一層,這樣開發者更容易控制系統,或者說更容易讀取或者修改系統的組件,手勢,動畫框架和控件等等。
我應該用Flutter開發我的下一個APP產品嗎?
Flutter正在開發中并尚未達1.0版,不過API很穩定,你需要的特點基本上已經都提供了,所以最終取決于你自己。
Flutter SDK包括哪些東西?
*深度優化,手機優先的2D渲染引擎以及對文本的極佳支持。
*Rx(響應式編程)框架
*針對Android和iOS豐富的控件集合
*提供單元和集成測試API
*提供連接系統和第三方SDK的API
*使用命令行來create, build,test 和 compile APP
Flutter工作是否需要編輯器或者IDE?
在IntelliJ IDEA(同時支持Ultimate和Community版本)里面安裝Flutter插件即可工作。或者你可以結合flutter命令行和支持編輯Dart的編輯器。
Flutter是否包含框架?
是的,有響應式編程框架,靈感來源于React框架。不過該框架是可選的,開發者可以選擇使用該框架的一部分或者換一個其他框架。
Flutter用什么技術構建的?
C, C++, Dart, and Skia (2D 渲染引擎)
Flutter如何將代碼運行在Android上?
引擎的C/C++代碼使用Android的NDK編譯的,并且框架的大部分和APP代碼作為本地代碼(由Dart編譯器編譯的)運行的。
Flutter如何將代碼運行在iOS上?
引擎的C/C++代碼使用LLVM編譯,并且任何Dart代碼都是AOT編譯成本地代碼。
Flutter使用了我的系統的原生(OEM)控件嗎?
沒有,Flutter提供了一系列的MD風格和Cuperitno(iOS風格)風格的控件,假如我們復用OEM控件,那么FLutter APP的性能會被這些控件質量所限制。
開發FLutter使用什么語言?
使用Dart語言,其底層圖表框架和Dart虛擬機用C/C++實現。
為什么FLutter選擇使用Dart?
選擇一門編程語言遵循如下標準:
*提高開發效率:一套代碼運行在iOS和Android,極大地加速開發。
*面向對象:FLutter需要創建可視的用戶體驗,所以被選擇的語言應該是面向對象編程,并且在構建UI框架上經驗豐富。如果選擇非面向對象語言就是重復造輪子。
*可以預見的,高性能的:FLutter旨在讓開發者開發更迅速,讓用戶體驗更流暢。為了實現該目標,需要每個動畫幀能夠運行大量的代碼,也意味著被選擇的語言能同時傳遞高性能和傳遞可預見的性能,而不是由于周期性停頓而引起丟幀。
*快速分配內存:FLutter框架使用了Rx響應式編程,它依賴于底層內存分配器(處理小而短的內存分配),所以被選擇的語言需要有該特性。
Dart語言滿足這四個條件,除此之外,我們還有機會與Dart社區一起近距離工作(不斷完善Dart以便在Flutter中更好的使用)。
Flutter引擎有多大?
2017年5月,我們測量了Flutter APP的最小尺寸(沒有MD風格,僅僅是Center控件),release版apk接近6.7M。在這個最小apk中,核心引擎大約3.3M,框架和APP代碼約1.25M,LICENSE文件(在app.flx中)約55k,必須的Java代碼(classes.dex)是40k,還有2.1M的ICU數據。你也可以自己測量你的APP大小,執行flutter build apk 并查看 app/outputs/apk/app-release.apk。
Flutter APP性能究竟如何?
性能很優秀,Flutter是為60fps而設計的,Flutter運行的是編譯后的代碼,而不是解釋性程序,這意味著Flutter能快速啟動。
從IDE下載程序到手機需要多長時間?
Flutter有熱加載(hot reload)功能,亞秒級加載時間。熱加載功能是狀態保持的(stateful),也就是說熱加載后APP狀態是保留的,這意味著你可以快速重復屏幕內容而不需要從主屏幕開始加載。
熱加載與完全重啟哪里不同?
熱加載是注入源代碼到運行中的Dart虛擬機,包括增加新的類,和給已有類增加新的方法和變量以及修改已有方法。下面幾種情況熱加載無效:
*全局變量初始化
*靜態變量初始化
*修改main()方法
Flutter APP支持的設備和操作系統版本?
支持的手機操作系統:Android Jelly Bean, v16, 4.1.x or newer, and iOS 8 or newer
手機硬件:64-bit iOS 手機(從iPhone 5S開始), and ARM Android 手機。
支持Android 和iOS物理設備,支持Android和iOS模擬器,不支持平板。
能在已經存在的原生APP中使用Flutter嗎?
可以,你可以嵌入Flutter視圖到你已經存在的Android和iOSAPP中,相關文檔正在開發中。
能訪問跨平臺的服務和API嗎,比如傳感器和本地存儲?
可以,Flutter支持開發者開箱即用來訪問一些平臺特性的服務和API。然而,為了避免大多數跨平臺API出現的”最小公分母”問題,我們不打算支持所有的跨平臺服務和API。最后,鼓勵開發者使用Flutter的異步消息來創建平臺和第三方API綜合體。
控件能夠繼承和自定義嗎?
當然可以,Flutter的控件系統被設計為很容易自定義。Flutter并沒有為每一個控件提供很多參數,而是提供創作。比如說,RaisedButton 控件并不是普通button控件的子類,而是Material 控件和GestureDetector控件的組合,前者提供視覺設計,后者提供交互設計。如果你想創建一個自定義視覺設計的button控件,可以與實現了你的視覺設計的GestureDetector控件相結合,比如說CupertinoButton控件。視覺設計與交互設計的結合創作賦予開發者最大的控制權,并且還能復用大量代碼。我們已經將復雜的控件分解為多個獨立的控件(分別實現視覺,交互和手勢),你可以任意組合。
能與手機平臺默認編程語言交互嗎?
可以,能與開發Android的Java代碼和開發iOS的 Objective-C或Swift交互,Flutter APP與手機平臺通過BasicMessageChannel傳遞消息。
Flutter開發中并行和并發問題?
Flutter支持虛擬機的堆隔離,所以支持并行,隔離后通過異步消息通信。暫不支持共享內存并發解決方案。
據國外媒體報道,兩年多來,谷歌一個秘而不宣的工程師團隊一直致力于Fuchsia項目,他們希望Fuchsia最終將取代占據全球主導地位的移動操作系統Android。傳言Flutter也將是fuchsia系統的主要框架,時代在進步啊。
當然若考慮棄用Android和Chrome,谷歌可能面臨其他風險。大量獨立開發者以及三星、華為和LG等設備制造商都依賴著Android操作系統。Chrome也是許多學校和機構的筆記本電腦所采用的重要操作系統。谷歌不能簡單地停止支持Android和Chrome操作系統、指望這個龐大的生態系統能夠迅速替換成Fuchsia生態。
另一個風險則來自Fuchsia的技術架構。Android和Chrome操作系統都是基于Linux而構建的。“Linux內核”是Google當前這些操作系統的核心,負責處理智能手機和其他設備的硬件和軟件之間的指令。 Fuchsia使用了一種名為Zircon的不同內核,它棄用了Linux中的許多舊技術。這可能使一些現有設備不兼容。
不過,棄用Linux也可能有益于谷歌。這就得談到谷歌和甲骨文之間冗長而又繁雜的訴訟戰了:Android的構建使用了甲骨文擁有的Java技術,而甲骨文指控谷歌竊取這些技術用于推動其移動業務。棄用Linux將在這場訴訟中有利于谷歌。
Fuchsia項目帶來的另一個有利之處是,為谷歌的資深開源黑客帶來技術挑戰。谷歌常常安排一些老員工參與這類需耗費大量時間的復雜項目中,以降低他們跳槽的風險。有人這么描述Fuchsia項目,“這個項目旨在留住高級工程師。”
據最新消息,谷歌向媒體CNET透露,Fuchsia何時能應用于設備中尚不明確,不存在什么“五年計劃”。在一份聲明中,谷歌把這個操作系統描述為“谷歌正展開的眾多實驗性開源項目之一”,目前不存在把它用在未來產品的時間表。不過我覺得這也是一個趨勢,已谷歌的力量,未來也不是說不能完全洗過來的。