再談 Flutter
一個月前,因為頭條準備接入 Flutter,我簡單的調研了一下。當時寫了一篇總結:ofollow,noindex">談談我對 Flutter 和 RN 的看法 。總結來說就是比較看好 Flutter,也參與了早期 Flutter 專案的搭建過程。
隨著專案一期的灰度上線,我得以抽出一定的時間回顧這一個月來的研發過程,並且做出下個雙月的規劃。隨著對 Flutter 瞭解的加深,我開始重新思考一個問題:“Flutter 真的是一個優秀的,值得 all in 的跨平臺方案麼? ”雖然技術一直在發展,但是多思考這類問題,有助於我們更加清醒,更加高瞻遠矚的看待技術。
Flutter 不像是個正常工程師寫的庫
首先談一談表面現象,正如標題所說,Flutter 不像是正常工程師寫的庫。它有一些非常搞笑,非常低階的設計問題:
- Issue 數量只增不減。截止我寫作時,Flutter 的issue 數量 已經達到 3848 個,並且我很看好它突破 4K。而作為競爭對手之一的React Native ,僅僅 653 個。Issue 的數量側面反映出團隊的維護熱情,和專案的質量。作為一個內部開發了兩三年,又對外公開了半年,甚至已經 Prelease 了好幾個月的庫來說,實在是不應該。
- 莫名其妙的 Bug。比如有一段時間, 就算你按照官方的文件,也無法把 iOS 的 Demo 執行起來,後來發現原因是底層某個正則表示式寫錯了,導致無法識別本機的 IP 地址。這種低階錯誤出現在 Flutter 上,還帶來這麼大的影響,實在是無法忍受的。
-
極為外行的設計。Flutter 的很多工程設計,在我看來也就是大學生水平。比如
flutter attach
命令在我的電腦上可以執行,在同事電腦上就不行。浪費一晚上後才發現,它要求專案根目錄裡一定要存在build
資料夾,內容不重要,但一定要存在,否則就報錯。再比如它的執行日誌是直接輸出到工程目錄下的,如果你不配置gitignore
,專案就會被搞得一團糟。最最匪夷所思的是,如果想把 Flutter 和已有 Native 專案結合起來,必須修改 Flutter 原始碼才行,因為原始碼裡面寫死了專案名稱必須是Runner 。以後每換一個專案,還得再改一次原始碼。
Flutter 的優勢真的是優勢麼
相比於 React Native,Flutter 主要的優勢在於,它提供了一套繪圖引擎,也就是跨平臺的 UIKit,來保證一套程式碼在兩端的展示效果 是一樣的。
但仔細想一想,Flutter 的優點,也就是 UI 樣式在雙端展示的效果強一致,真的是我們在乎的麼?我倒不這麼認為,主要是有以下理由:
- 使用者對雙端 UI 不一致是有預期,而且可接受的。安卓的 Material Design 和 iOS 的扁平化風格本來就不一致。國內的產品和設計為了簡單,有時候也直接使用 iOS 的風格。而且也不會有使用者閒著沒事,拿兩個手機玩找茬遊戲。
- 以 React Native 為例,剛剛說了同一個元件在雙端效果不一致並不是問題,但如果某一段的功能有 Bug,就需要單獨修復了。這才是 Flutter 真正解決的問題,但平心而論,這種需求很多麼?解決這種需求花費的時間很多麼?我看是一個值得討論的問題。
- 我個人認為,相比於 UI 風格的問題,更多的問題還是出現在在與 Native 的適配上。比如已有的幾乎所有客戶端元件,都需要寫一個 Bridge(Flutter 中的術語叫 Plugin,為了方便大部分同學理解,我統一叫 Bridge)。而且隨著雙端客戶端元件的不斷迭代,Bridge 也需要迭代。因為很難要求 Native 元件的維護人還會 Flutter,所以不得不抽調專門的同學,同時瞭解 Native 元件的業務邏輯和 Flutter,並且長期參與迭代維護,這會消耗大量的人力。
- Flutter 的設計很美好,用來寫新的 App 是毫無問題。但一旦整合到已有專案中,必然會和 Native 產生強耦合。比如安卓和 iOS 的導航棧實現方式不同,就需要雙端各自適配。再比如現在硬體五花八門,每種硬體特性也要適配。雖然每個功能的適配看起來都是小問題,但萬萬不可低估無數個小問題疊加起來以後,對長期維護帶來的影響。不是有句古話說的挺好麼:“路遠無輕擔 ”。
同時我們不能忘了,Flutter 的缺點也很明顯:
- 不能熱更新
- 不能實現前端需求
- Dart 生態不夠成熟,學習成本高
在我之前的調研中,我把 Flutter 定義為一個替換 Native 開發 的方案,所以倒也不在乎前兩個問題。第三個問題是被我低估的,我一直覺得這種新的語言和工具,學習下就可以了。但是站在團隊角度,還是要考慮下投入產出比的。以做一個雙端需求為例:
原來:iOS 1人力 + 安卓 1 人力,基礎設施齊全
現在:Flutter 1.2 人力(這真是很樂觀估計了,學習成本在很長一段時間內不會消失),因為踩坑或者適配 Native 元件,iOS 0.4 人力,安卓 0.4 人力,最後還是 2 人力。
這還是在儘量複用 Native 已有設施的情況下的統計,如果還想統一一下,用 Dart 來實現,絕對會投入更多的人力。以我們上個雙月的進度來看,一共投入四個人力做 Flutter,也只不過是解決了最基本的的問題,勉強能上線而已。距離做到完美,還需要以年為單位進行投入。