關於Flutter 您必須知道的知識點!!!

被被Android開發之路發表於2019-05-07

Flutter.jpg
Flutter 是一套高效的跨平臺免費開源 SDK,可以幫助開發者用一套程式碼同時在 Android 和 iOS 上構建媲美原生體驗的精良應用。隨著Flutter 1.0 的正式到來,我們從社群中也蒐集到了不少開發者關注的問題,我們會用連載的形式由淺到深地為開發者們進行解答。如果您對 Flutter 已經有一定的瞭解,不妨在看到問題的時候先試著回答,然後和我們給出的答案進行比較,從而進一步加深理解。

介紹篇

Flutter 是什麼?

Flutter 是 Google 的移動應用 SDK,用於在極短時間內在 Android 和 iOS 平臺上建立高質量的原生體驗。Flutter 可以和既有程式碼相容,世界各地的很多開發者和組織都在使用它,並且它是免費和開源的。

Flutter 能做什麼?

對於應用的使用者來說,Flutter 可以讓他們體驗到美觀靈活的 UI。

對於開發者來說,Flutter 降低了建立移動應用的門檻。它加速了移動應用的開發,降低了兼顧 Android 和 iOS 應用開發的成本和複雜性。

對於設計師而言,Flutter 可以確保精確地實現設計意圖,而無需降低保真度或被迫進行妥協。在設計師的手裡,Flutter 還可以作為一種高效的原型設計工具。

哪些人會用到 Flutter?

Flutter 適用於希望快速構建精美的移動應用,或者希望用一套程式碼庫覆蓋更多使用者的開發者。

Flutter 也適用於需要領導移動開發團隊的開發管理人員。Flutter 可以讓開發管理人員打造一個統一的移動應用開發團隊,以便更快地開發更多功能,同時將相同的功能部署到 Android 和 iOS 版本的應用中,並降低維護成本。

雖然設計師群體不是 Flutter 最初的目標受眾,但 Flutter 也適用於那些希望將原始設計意圖高保真地傳遞給所有移動使用者的設計師。

說到底,如果您想要漂亮的應用,令人愉悅的動效和動畫,以及富有個性和身份感的 UI,那您就是 Flutter 的目標使用者。

我需要擁有怎樣的開發經驗才能使用 Flutter?

如果您熟悉物件導向概念 (類、方法、變數等) 和指令式程式設計概念 (迴圈、條件等) ,您會發現 Flutter 很容易上手。

不過需要強調的是,學習和使用 Flutter 無需具備移動領域的開發經驗。

就我們親歷過的例子來說,程式設計經驗並不豐富的人們一樣可以學習並使用 Flutter 進行原型設計和應用開發。

我可以用 Flutter 構建怎樣的應用?

Flutter 針對在 Android 和 iOS 上執行的 2D 移動應用進行了優化。

如果您的應用強烈需要表達出品牌個性,Flutter 會非常適合。不過,即便您想要打造的應用看起來像是股票平臺那樣複雜,也可以使用 Flutter 來構建。

Flutter 可以構建功能齊全的應用,包括使用攝像頭、地理位置、網路、儲存、第三方 SDK 等。

Flutter 有哪些獨到之處?

Flutter 與大多數用來構建移動應用的工具不同,因為它既不使用 WebView,也不使用裝置附帶的 OEM Widget,而是使用自己的高效能渲染引擎來繪製 Widget。

Flutter 與其它工具的不同之處還在於,它只有一層簡潔的 C/C++ 程式碼,在這之上,Flutter 使用 Dart (一種現代化的、簡潔的面嚮物件語言) 實現其大部分系統功能 (佈局、手勢、動畫、框架、Widget 等),這種語言使得開發者可以輕鬆地進行閱讀、更改、替換或刪除。

這些特性都為開發者提供了巨大的系統控制許可權,同時顯著降低了訪問大多數系統功能的門檻。

內容篇

Flutter SDK 裡有什麼?

高度優化的針對移動應用的 2D 渲染引擎,更具備出色的文字支援功能、現代化的 react 風格框架、適用於 Android 和 iOS 的豐富 Widget、用於單元和整合測試的 API、用於連線系統和第三方 SDK 的互操作及外掛 API、無介面 (headless) 測試執行器,用於在 Windows、Linux 和 Mac 上執行測試、命令列工具,用於建立、構建、測試和編譯應用。

用 Flutter 開發時可以使用哪些編輯器或 IDE ?

可以通過外掛的方式使用 Android Studio、IntelliJ IDEA 和 VS Code 進行 Flutter 開發。您也可以在命令列中使用 flutter 命令,並配合能編輯 Dart 語言的編輯器進行開發。

Flutter 裡存在開發框架嗎?

是的,Flutter 自帶了現代化的開發框架,靈感正是來自 React。Flutter 的框架旨在實現分層、可定製 (以及靈活的開發選項)。開發者可以選擇僅使用框架的一部分,或是使用另外的框架。

Flutter 裡存在 Widget 嗎?

是的,Flutter 自帶了一套高品質的 Material Design 和 Cupertino (iOS 風格) Widget、佈局和主題。當然,這些 Widget 只是一個起點。Flutter 的設計目的就是,讓您輕鬆建立自己的 Widget,或是定製現有的 Widget。

Flutter 支援 Material 主題定製 (Theming) 嗎?

是的,Flutter 和 Material 團隊密切合作,完全支援 Material Theming。

Flutter 帶有測試框架嗎?

是的,Flutter 提供用於編寫單元和整合測試的 API。我們使用自己的測試功能來測試我們的 SDK,每次提交程式碼前我們都會測量提交的測試覆蓋率。

Flutter 和 ReactNative( RN ) 的異同?

RN 是使用JS程式碼呼叫系統的原生控制元件,最高支援 60fps。 Flutter 不使用系統的原生控制元件, Flutter 基於GPU渲染,所以確保了 高效能,最高支援120fps,甚至不輸原生。 Flutter只需要維護一套UI 程式碼:Flutter 在IOS和Android 是一套 UI 風格元件,所以 Flutter 需要做很少適配,因為上層只有一套UI程式碼。RN是同一套程式碼在IOS和Android顯示不同的風格,需要適配維護兩個程式碼庫。 相同點: 和RN類似,基於元件開發Weight,一切皆元件。

Flutter引擎有多大?

官方曾測量了一個最小的 Flutter 應用(不含 Material 元件,僅有一個 Center 控制元件,使用 flutter build apk 構建),並打包為 release 版本,大小約為 4.06 MB。該APP:核心引擎大約為 2.7MB(已壓縮),框架和應用程式程式碼大約 820.6KB (已壓縮),LICENSE 檔案為 53.5KB(已壓縮),必要的 Java 程式碼 (classes.dex) 為 61.8KB(已壓縮),此外還有大約 450.4KB(已壓縮)的 ICU 資料。

因此相對應用程式,Flutter的引擎並不大。

Flutter可以構建桌面應用程式嗎?

可以,但目前專注於移動端優先。未來會支援 WIndows , Mac 和 Linux。

Flutter的標記語言在哪裡?

為什麼Flutter沒有標記語法(類似於Android的XML佈局檔案)?

和Android原生開發不同,使用程式碼動態構建的UI會更靈活:

  • 嚴格的標記系統難以表達和生成具有特定行為的widget。

  • “程式碼優先”更好地支援熱過載和動態環境適應等功能。

可以在Flutter中使用JSON 嗎?

必須可以,有關如何在Flutter中使用JSON的教程,請參閱 JSON教程。

Flutter支援和原生混合開發麼?可以在當前原生APP中嵌入Flutter麼?

可以,目前可以在現有的Android或iOS應用中嵌入Flutter,但是當前可能不太完善。 這裡是官方文件以供參考。

為什麼Flutter選擇使用Dart語言?

Dart執行時和編譯器支援Flutter的混合編譯:

基於JIT的快速開發週期:允許使用型別的語言進行形狀更改和有狀態的熱過載

基於AOT編譯器,可生成高效的ARM程式碼,可以快速啟動並擁有可預測的生產部署效能。

Dart由谷歌維護,Dart社群正在積極投入資源改進Dart在Flutter中的使用。

Dart語言效率高,這點最重要!!!,這對framework團隊和開發人員都非常重要。因為大部分Flutter功能都是用Dart實現,因此我們需要在10萬行程式碼時能保持高效的而不會犧牲framework和widget的可讀性。

Dart物件導向。絕大多數開發人員都具有物件導向開發的經驗,因此更容易學習如何使用Flutter進行開發。

Dart可預測,高效能。 Flutter框架使用函式式流,它很大程度上依賴於底層的內 存分配器,從而有效地處理小的、短期的記憶體分配會非常重要,所以在缺 乏此功能的語言中Flutter無法有效地工作。

Flutter是什麼語言編寫的?

Flutter的不同是因為它核心只有一層輕量的C/C++程式碼。Flutter在Dart中實現了其它大部分系統(組合、手勢、動畫、框架、widget等),開發人員可以輕鬆地進行讀取、更改、替換或移除。這為開發人員提供了對系統的巨大可定製性。

Flutter框架使用什麼程式設計正規化?

Flutter是一個多正規化程式設計環境。 集合了過去十多年優秀的開發正規化:

組合:Flutter使用的主要範例是使用小物件,然後將它們組合在一起以獲得更復雜的物件。比如Weight之間的相互巢狀。

函數語言程式設計:整個應用程式可以僅使用StatelessWidget來構建 ,這些函式本質上是描述引數如何對映到其他函式的函式。

事件驅動:使用者互動由事件物件表示,這些事件物件被分派給註冊了事件處理程式的回撥。螢幕重新整理也由類似的回撥機制觸發。

基於類的物件導向程式設計:框架的大部分API都是使用繼承類來構建的。我們使用一種方法來在基類中定義非常抽象的API,然後在子類中迭代地對它們進行定製化。

指令式程式設計:直接指令式程式設計通常與物件內部封裝的狀態配對,用於提供最直觀的解決方案。

響應式程式設計:widget和元素樹有時被描述為響應式的,因為在widget的建構函式中提供的新輸入會立即作為widget的構建方法對較低階別widget的更改傳播,並在較低widget中進行更改(例如,作為響應到使用者輸入)通過事件處理程式傳播回widget樹。

泛型:泛型檢測可用於幫助開發人員及早發現程式設計錯誤。Flutter框架使用泛型程式設計來處理這個問題。

併發:Flutter大量使用非同步API。例如,動畫系統通過Future來完成動畫完成時的通知。影像載入系統同樣使用Future在載入完成時進行報告。

約束:Flutter中的佈局系統使用弱形式的約束程式設計來確定佈局的幾何形狀。約束(例如,父控制元件將大小約束傳給子控制元件)滿足這些限制。通過使用這種技術,Flutter可以更加精準的控制佈局。

最後送福利了,現在關注我並且加入群聊可以獲取包含原始碼解析,自定義View,動畫實現,架構分享等。 內容難度適中,篇幅精煉,每天只需花上十幾分鍾閱讀即可。 大家可以跟我一起探討,歡迎加群探討,有flutter—效能優化—移動架構—資深UI工程師 —NDK相關專業人員和視訊教學資料,還有更多面試題等你來拿~ 群號:661841852

QQ截圖20190510143109.jpg

點我加入群聊【Android開發行業交流】

相關文章