靈魂拷問:flutter構建應用的方式是否是一種倒退?

程式媛加油丫發表於2021-05-26

前言

前一陣子有一個網友問了我一個問題:

在以往軟體或者應用開發中,不管是哪種設計模式,mvc也好,mvvm也好,通常都是佈局和程式碼邏輯各自獨立,比如微軟體系下軟體開發下用xaml寫佈局cs程式碼寫邏輯,諸如此類的蘋果安卓都是這樣。

這樣的做法的誕生,在當時應該是一種進步。但是谷歌新移動端框架flutter是佈局跟程式碼邏輯又一起寫了。這是退步還是螺旋上升到這個階段了?

順便這位網友還向我吐槽了一下 Flutter 的括號。

今天就在這裡好好說一下這個flutter吧。

淺談Flutter的未來

3月4日,谷歌正式釋出了 Flutter 的 2.0。該版本最大的特性就是可以支援五大主流的作業系統:iOS、Android、Linux、Windows 和 MacOS。官方甚至還說豐田將會把 Flutter 帶到汽車中。

也就是說,我們可以用一套 Flutter 程式碼適配全平臺了。一切似乎都是朝著好的方向發展。

但是,不少人心中都有一個疑惑:flutter構建應用的方式是否是一種倒退?Flutter不是正在被放棄嗎?

其實這個問題一直都有人在問,在這裡,我就直接引用阿里的閒魚團隊客戶端負責人於佳(宗心)的話吧:

跨平臺本身的對企業來說在成本側是有很大的訴求的,在未來作業系統有可能走向分裂,多終端的場景下,Flutter 會有比較不錯的發展。在生態更加完善後,Flutter 會在一定的歷史階段成為客戶端研發的另一種常見的技術選擇。

上月初,谷歌正式釋出的 Flutter 2.0版本最大的特性就是可以支援五大主流的作業系統:iOS、Android、Linux、Windows 和 MacOS。

也就是說,用一套 Flutter 程式碼適配全平臺已經不再遙遠。

他的觀點筆者深以為然。

我看Flutter

個人感覺Flutter比安卓開發的心智負擔要更低。

用統一的語言和程式碼實現所有功能,需要記憶的細節更少一些,因為所有東西都是dart的widget類,互動起來都是一摸一樣的。而xml和邏輯分開寫尤其是在動態改變元素的時候就會潛意識的糾結寫在哪裡,而且各種諸如inflate之類的細節都要記住。

關於邏輯介面分離

BLoC模式是我目前見過的邏輯介面分離的最徹底最直白的模式,主要是因為dart對於Stream的支援和flutter的StreamBuilder,FutureBuilder等一系列內建控制元件。

而本來就應該結合在控制元件內部的簡單邏輯,flutter寫起來更方便,直接原樣寫進build(context)裡。

針對網友的提問

這個其實感覺更多的是取決於Flutter的定位。

看看MVC和MVVM,都是基於應用層或者服務層提出的設計模式。因為對於一個Web應用,或者客戶端APP,UI是一部分,但除了UI,還有業務實現,網路請求,資料管理等。如何將這幾個部分有效結合,同時合理分層,利於維護和擴充套件,避免衝突,這是工程要解決的問題,所以有了MVC,MVP,MVVM這些設計模式。

再來看看Flutter,現在它的主要定位還是一個UI框架,只是說對於普通的UI框架,它可以跨端的同時保持了近乎原生級UI效能,但它的本質還是和UI框架。也就是說,它的核心能力就是生產一個個大大小小的Widget,然後將它們組織起來,管理它們的狀態,再換個角度說,Flutter就是這些MVx模式中的V。從這點去思考,應該就不難理解為何Flutter會設計成直接在程式碼中寫佈局了,因為它們都是同一層的事情,沒必要分開。React會考慮CSS-in-JS,以及直接在JS中寫類HTML標籤(JSX)應該也是一樣的道理。React的定位就是一個UI庫,和UI相關的,樣式,佈局,事件,寫在一起,沒毛病。如果開發者不習慣或者堅持分離的原則,可以自己擴充套件,於是就有了琳琅滿目的React模組。

所以,我認為Flutter構建應用的方式不是一種倒退,是基於定位的一種合理方案,雖然不一定是最優解,但是合理的。誰也不知道最優解是怎樣的,取決於開發者自身的習慣,取決於專案的規模,取決於公司團隊的規約等等。那麼Flutter完全可以把一部分工作交給社群,交給開發者。如果開發者覺得程式碼裡寫佈局不優雅,那就通過其他模組或者外掛去擴充套件能力。Flutter的核心能力是製造widget管理widget,如果想讓它一直保持活力,需要的不僅僅是開發者通過它來造widget,還要為它造“widget”。

還有就是,題主覺得Dart的程式碼最後是一堆的}}}…},問題主要不在語言,或者框架的設計本身,關鍵在開發者組織程式碼管理程式碼的能力。以我的經驗,任何形式風格的程式碼,任何邏輯實現,然後方法的呼叫,但凡是一堆),或者一堆},或者縮排很深的,說明你的程式碼需要review和refactor了。

筆者感想

其實現在很多開發者都對 Flutter 有偏見。因為感興趣和愛好而去主動鑽研的人不算多,但是我還是想說,Flutter 他值得!

為什麼 Flutter 對Android開發來說值得?

1.Flutter 有很多優點

(1)國際化方案非常友好

Flutter官方提供的國際化方案對佈局的國際化做的非常友好,文案的國際化在Flutter Intl外掛的加持下也非常簡單。(或許微不足道,但是真的超級方便)

(2)執行效率高

就目前市場的大環境來講,主流的跨端方案有兩種:

  • 將 JavaScriptCore 引擎當作虛擬機器的方案,代表框架是 React Native;
  • 使用非 JavaScriptCore 虛擬機器的方案,代表框架就是我們今天的主角 Flutter。

JavaScriptCore, 主要是為了相容 Web 標準留下的歷史包袱,無法專門針對移動端進行效能優化。而 Flutter 一開始就是使用全新的 Dart 語言編寫,同時支援 AOT 和 JIT 兩種編譯方式,而沒有采用 HTML/CSS/JavaScript 組合方式開發,在執行效率上明顯高於 JavaScriptCore 。

(3)降低成本,減少雙端投入

閒魚技術團隊決定 Dart First的時候主要就是因為這一點,降低組織成本、學習成本、協同成本。架構的一致性對研發效能和質量也有很大的幫助。

Flutter 還有更多優點等待大家在實踐中發掘。

2.Flutter 是市場的選擇

經手機上用 libChecker 進行的統計資料,現在有很多使用 Flutter 的應用。我們可以看到,現在 Flutter 正在被很多大公司採用:

  • 京東的京東讀書
  • 阿里的閒魚
  • 騰訊的微信和 Now 直播
  • 位元組跳動的西瓜視訊
  • ……

一個新技術的普及,企業級應用一定會先在頭部網際網路企業產生,然後逐步優化降低門檻。現在用 Flutter 的大廠越來越多,相信那個爆發的臨界點應該不遠了。

Flutter 現在已經不是曾經的小眾框架,它已經逐步成長為主流的跨平臺開發框架之一。

3.Flutter 是找工作的加分項

Flutter目前也是Android開發崗位的加分項,下面是我在Boss上面搜到的一部分招聘資訊。

通過上圖我們可以看出,很多大廠在高薪招聘這方面的人才,Flutter 確確實實可以成為我們找工作的一個幫助。

Flutter 也可以幫助到我們的職業發展。技術是相通的,當我們在學習Flutter時,也能把原有的技術聯通、打通。我們可以通過 Flutter 放大自身業務開發能力,參與到更多的平臺開發中。

有一個說法是:對於 Android 原生開發來說,學會 Flutter 等於學會了 70% 以上的 Jetpack Compose 。

Android開發該如何快速上手Flutter?

當你快速搭建好環境,簡單瞭解 Flutter 的 API 之後,你的 Flutter 學習之路需要面對的主要有兩個核心點:一個是響應式開發,另一個是弄懂 Widget 的背後是什麼?

這兩點對我們Android開發來說都有一定的難度。

為了讓大家快速無痛上手 Flutter,在這裡免費分享給大家一份來自阿里大佬Git高星的 Flutter 學習筆記。

整理大綱

  • 為什麼Flutter是跨平臺開發的終極之選
  • 在Windows上搭建Flutter開發環境
  • 編寫您的第一個 Flutter App
  • Flutter開發環境搭建和除錯
  • Dart語法篇之基礎語法(一)
  • Dart語法篇之集合的使用與原始碼解析(二)
  • Dart語法篇之集合操作符函式與原始碼分析(三)
  • Dart語法篇之函式的使用(四)
  • Dart語法篇之物件導向基礎(五)
  • Dart語法篇之物件導向繼承和Mixins(六)
  • Dart語法篇之型別系統與泛型(七)
  • Flutter中的widget

注:鑑於目前網上沒有比較規範、系統的整理,該學習手冊中的內容都是根據筆者的一個框架在網上進行的蒐集整理。本文開源,僅用於技術交流分享,感謝大佬熊貓先生Dart語法部分的部落格分享,感謝一同整理資料的小夥伴。大家可以動動小手,點波關注,瞭解更多flutter內容!

點選【此處】進入我的公眾號,新增備註【flutter】,免費獲取這份資料的完整版

資料詳情

為什麼Flutter是跨平臺開發的終極之選

  • 這是為什麼?
  • 跨平臺開發
  • 什麼是 Flutter
  • Flutter 的特性
  • Flutter 構建應用的工具
  • 使用 Flutter 構建的熱門應用
  • 構建 Flutter 應用的成本
  • ……

在Windows上搭建Flutter開發環境

  • 使用映象
  • 系統要求
  • 獲取Flutter SDK
  • 編輯器設定
  • Android設定
  • 起步: 配置編輯器
  • 起步: 體驗
  • 體驗熱過載
  • 建立新的應用
  • 執行應用程式
  • ……

第三章 編寫您的第一個 Flutter App

  • 第1步: 建立 Flutter app
  • 第2步: 使用外部包(package)
  • 第3步: 新增一個 有狀態的部件(Stateful widget)
  • 第4步: 建立一個無限滾動ListView
  • 第5步: 新增互動
  • 第6步: 導航到新頁面
  • 第7步:使用主題更改UI
  • ……

第四章 Flutter開發環境搭建和除錯

  • 開發環境的搭建
  • 模擬器的安裝與除錯
  • 開發環境的搭建
  • 模擬器的安裝與除錯
  • ……

第五章 Dart語法篇之基礎語法(一)

  • Hello Dart
  • 資料型別
  • 變數和常量
  • 集合(List、Set、Map)
  • 流程控制
  • 運算子
  • 異常
  • 函式
  • ……

第六章 Dart語法篇之集合的使用與原始碼解析(二)

  • List
  • Set
  • Map
  • Queue
  • LinkedList
  • HashMap
  • Map、HashMap、LinkedHashMap、SplayTreeMap區別
  • 命名建構函式from和of的區別以及使用建議
  • ……

第七章 Dart語法篇之集合操作符函式與原始碼分析(三)

  • Iterable(Iterable類關係圖、Iterable類方法圖……)
  • forEach(介紹、使用方式、原始碼解析……)
  • map(介紹、使用方式、原始碼解析……)
  • any(介紹、使用方式、原始碼解析……)
  • every(介紹、使用方式、原始碼解析……)
  • where(介紹、使用方式、原始碼解析……)
  • firstWhere和singleWhere和lastWhere(介紹、使用方式、原始碼解析……)
  • join(介紹、使用方式、原始碼解析……)
  • take(介紹、使用方式、原始碼解析……)
  • takeWhile(介紹、使用方式、原始碼解析……)
  • ……(內容太多)

第八章 Dart語法篇之函式的使用(四)

  • 函式引數
  • 匿名函式(閉包,lambda)
  • 箭頭函式
  • 區域性函式
  • 頂層函式和靜態函式
  • main函式
  • ……

第九章 Dart語法篇之物件導向基礎(五)

  • 屬性訪問器(accessor)函式setter和getter
  • 物件導向中的變數
  • 建構函式
  • 抽象方法、抽象類和介面
  • 類函式
  • ……

第十章 Dart語法篇之物件導向繼承和Mixins(六)

  • 類的單繼承
  • 基於Mixins的多繼承
  • ……

第十一章 Dart語法篇之型別系統與泛型(七)

  • 可選型別
  • 介面型別
  • 泛型
  • 型別具體化
  • ……

第十二章 Flutter中的widget

  • Flutter頁面-基礎Widget
  • Widget
  • StatelessWidget
  • Stateful Widget
  • State生命週期
  • 基礎widget
  • 文字顯示
  • ……

點選【此處】進入我的公眾號,新增備註【flutter】,免費獲取這份資料的完整版

最後

希望這份資料可以給想要了解 Flutter 並快速上手的朋友幫助以及一個參考方向。

千里之行始於足下,願你我共勉。

相關文章