天天看點

Flutter學習路線總結第0步 技術選型第一步 環境的搭建第二步 開發語言的學習第三步 Flutter 開發起步

作為一個多年的移動端開發人員,之前使用過Hybrid和RN混編技術在原生中開發,現使用Flutter開發也有一年多了,項目一直在持續疊代中,并做過架構,封裝過多個元件和插件。在這裡做個總結,希望能給感興趣的同學一些幫助。

學習一門技術或語言不要上來就直奔代碼,要先知道為什麼要選擇這門技術,這門技術解決了什麼、和同級語言相比的優缺點等。是以第一篇文章我會簡單從混編技術選型、環境搭建、開發語言的學習、Flutter開發起步幾個方面進行介紹,之後會陸續更新Flutter開發中遇到的問題的解決方案和架構方面的文檔。

第0步 技術選型

也跟很多朋友探讨過這個問題,到底是用原生還是混編方式去開發一個應用,我認為在移動網際網路的浪潮下,開發效率和使用體驗可以說是同等重要。使用原生的方式來開發APP,就需要我們必須對iOS和Android兩個平台分别開發,這對于中小型團隊來說就是有隐患和額外的負擔的。是以使用原生還是混編需要從公司的現有狀況和對産品的體驗要求等來考慮。

跨平台開發是為了增加業務代碼的複用率,減少因為要适配多個平台帶來的工作量,進而降低開發成本。

根據實作方式的不同,業内常見的觀點是将主流的跨平台方案劃分為三個時代。

  • Web 容器時代:基于 Web 相關技術通過浏覽器元件來實作界面及功能,典型的架構包括 Cordova(PhoneGap)、Ionic 和微信小程式。
  • 泛 Web 容器時代:采用類 Web 标準進行開發,但在運作時把繪制和渲染交由原生系統接管的技術,代表架構有 React Native、Weex 和快應用,廣義的還包括天貓的 Virtual View 等。
  • 自繪引擎時代:自帶渲染引擎,用戶端僅提供一塊畫布即可獲得從業務邏輯到功能呈現的多端高度一緻的渲染體驗。Flutter,是為數不多的代表。
Flutter學習路線總結第0步 技術選型第一步 環境的搭建第二步 開發語言的學習第三步 Flutter 開發起步

(此圖懶的畫,是在網上找的,Flutter 2.0後就已經支援Web了)

我們在做技術選型時,可以參考以上次元,從開發效率、技術棧、性能表現、維護成本和社群生态來進行綜合考慮。比如,是否必須支援動态化?是隻解決 Android、iOS 的跨端問題,還是要包括 Web?對性能要求如何?對多端體驗的絕對一緻性和維護成本是否有強訴求?

從各個次元綜合考量,React Native 和 Flutter 無疑是最均衡的兩種跨平台開發方案,而其他的方案或多或少都“偏科嚴重”。

React Native 依托于 Facebook,經過 4 年多的發展已經成長為跨平台開發方案的實際上司者,并擁有較為豐富的第三方庫和開發社群;

Flutter 以挑戰者姿态出現在我們的面前,可以提供更徹底的跨平台技術解決方案。雖然 Flutter 推出時間不長,但也有了諸多商用案例,加上清晰的産品路線圖和 Google 的強大号召力,Flutter 未來的發展非常值得期待。

第一步 環境的搭建

工欲善其事,必先利其器,任何一門新技術或語言的學習,首先都需要從基礎的環境搭建開始,直接看官網安裝即可https://flutterchina.club,選擇并下載下傳最新的穩定版本,根據流程安裝SDK和模拟器,官網已經介紹的很詳細,安裝完畢建立demo,能運作即可,也可以Hello World。

第二步 開發語言的學習

Flutter開發架構采用的開發語言是Dart,是以要用好Flutter這個構架,必須要搞清楚Dart語言。

對新技術或語言的學習中,一直都非常認同一個觀點:千萬不要直接陷入細節裡,你應該先鳥瞰其全貌,這樣才能從高次元了解問題。是以,要更高效地掌握 Dart,以最快的速度具備開發一款 Flutter 應用的能力,要從Flutter 開發的角度,了解Dart 語言出現的曆史背景、特性以及未來。

Dart是什麼?

2011年10月,在丹麥召開的GOTO大會上,Google釋出了一種新的程式設計語言Dart。如同Kotlin和Swift的出現,分别是為了解決Java和OC在編寫應用程式的一些實際問題一樣,Dart的誕生正式要解決JS存在的、在語言本質上無法改進的缺陷。

那麼,JS到底有哪些問題和缺陷呢?JS實際上是兩類程式設計語言風格的混合産物:函數式程式設計風格,與面向對象程式設計風格。由于設計時間太短,一些細節考慮不夠嚴謹,導緻後來一段時間,使用JS開發的過程混亂不堪。處于對JS的不滿,Google的程式員們決定自己寫一個新語言來換掉它,是以Dart的最初定位也是一種運作在浏覽器中的腳本語言。但JS的生命力似乎比預想的更強大。原來JS隻能在浏覽器中運作,但Node.js的出現讓它開始有能力運作在服務端,很快手機應用與桌面應用也成為了JS的宿主容器,比如React、React Native 、Vue等架構。是以Dart徹底轉變思路,成為專注大前端與跨平台生态的語言。

Dart是一種适用于網際網路的開放源代碼程式設計語言,由Google主導開發,于2011年10月公開。目标在于成為下一代結構化Web開發語言。 類似JavaScript,Dart也是一種面向對象語言,但是它采用基于類程式設計。

Dart的特性?

每門語言都有各自的特點,作為移動端開發的後來者,Dart語言可以說是集百家之長,擁有其他優秀程式設計語言的諸多特性和影子,是以對于其他語言的開發者而言,學習成本無疑是非常低的。

JIT和AOT

借助于先進的工具鍊和編譯器,Dart是少數同時支援JIT(Just In Time,即時編譯)和AOT(Ahead of Time,運作時編譯)的語言之一。

在開發期使用JIT編譯,可以縮短産品的開發周期。Flutter最受歡迎的功能之一熱重載,正式基于此特性。而在釋出期使用AOT,就不需要像React Native那樣在跨平台JavaScript代碼和原生Aandroid、iOS代碼之間建立低效的方法調用映射關系。是以說,Dart具有運作速度快、執行性能好的特點。 

記憶體配置設定與垃圾回收

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)上傳遞消息通信。(其實Dart是有辦法實作類似多線程的功能,後期會出文章介紹)

Dart的基礎學習?

需要了解Dart的特性、基礎文法、類型變量、函數等知識,我建議直接從官網中學習即可。

或者可以參考文章:https://jiangdg.blog.csdn.net/article/details/110823218

Flutter開發指南之理論篇:Dart文法01(資料類型,變量,函數)

Flutter開發指南之理論篇:Dart文法02(運算符,循環,異常)

Flutter開發指南之理論篇:Dart文法03(類,泛型)

Flutter開發指南之理論篇:Dart文法04(庫,異步,正規表達式)

Flutter開發指南之理論篇:Dart文法05(單線程模型,事件循環模型,Isolate)

第三步 Flutter 開發起步

從标準模版入手,體會Flutter代碼是如何運作在原生系統上的

Flutter學習路線總結第0步 技術選型第一步 環境的搭建第二步 開發語言的學習第三步 Flutter 開發起步

Flutter的知識體系:

Flutter學習路線總結第0步 技術選型第一步 環境的搭建第二步 開發語言的學習第三步 Flutter 開發起步

(持續更新中.....)

相關擴充問題:

Dart是單線程如何進行網絡請求同時繪制UI的(怎麼并發處理異步任務的),怎麼實作類似多線程的功能?

所有的Dart程式都在

Isolate

中運作,每個

Isolate

擁有自己的私有記憶體塊和一個

事件循環模型

,其中,

事件循環模型

就是用來處理各種事件,比如點輸入/輸出,點選,定時器以及異步任務等。