為什么說 Flutter 可能不是下一件大事?
讓一部分開發(fā)者看到未來

我注意到最近有很多文章將 Flutter 宣傳為“下一件大事”(next big thing)。一些人甚至詳細(xì)解釋了 Flutter 為什么會替代 React Native 成為開發(fā)人員首選的跨平臺技術(shù)。
但它并沒有那個能力。
我見識過 Flutter 的很多缺陷,我認(rèn)為它遇到了幾個關(guān)鍵問題。
請注意,本文在 Flutter 社區(qū)中招來了很多熱情的評論,贊成和反對皆有。我強(qiáng)烈建議讀者讀完本文,再去原文看評論區(qū)大家的正反意見。
只要談到跨平臺技術(shù),React Native 是繞不開的。
React Native 之所以受歡迎,是因為很多人相信它的愿景,并認(rèn)為自己的前端 JavaScript 開發(fā)人員可以創(chuàng)建一流的應(yīng)用。他們當(dāng)然做不到,但這并不能阻止他們嘗試一番。
問題是許多公司已經(jīng)有了 JavaScript 開發(fā)人員。而且 JavaScript 人士常常會告訴管理層:“是的,我們可以節(jié)約一半時間。”
正如我指出的那樣,其實他們做不到。確實,只要你入了門,起碼 80% 的應(yīng)用你都能很快搞出來個大概。可是你要將 80% 的時間花在應(yīng)用的外觀調(diào)整上,讓它能在各個平臺上正確運行。
說到各個平臺……
Flutter 的 Skia 渲染引擎可以讓你的應(yīng)用模仿原生的外觀和體驗,但也只是模仿而已。它可以編譯為原生代碼,但并不會使用原生按鈕、字段、切換、滾動條、表視圖或其他界面和導(dǎo)航元素。
蘋果和谷歌幾乎在每個發(fā)行版上都會調(diào)整和更新這些界面元素及其行為。因此,只要應(yīng)用忽略它們,就別想跟上節(jié)奏了。
此外,如果 iOS 上的 Flutter 出現(xiàn)錯誤,你只能等待谷歌來修復(fù)了。
說到 iOS……
我應(yīng)該強(qiáng)調(diào)一下,我是從 iOS 的角度開始體驗 Flutter 的,而 Flutter 的確讓 iOS 感覺像是二等公民。
Flutter 基本上是 Android 優(yōu)先的開發(fā)環(huán)境,從底層開始就依賴 Android 的 Material Design 指南。
因此,如果你想開箱即用地創(chuàng)建看起來像 Android 應(yīng)用、動起來也像 Android 應(yīng)用的東西,F(xiàn)lutter 很合適——否則……就沒那么舒服了。
此外,iOS 開發(fā)正在擴(kuò)展到蘋果生態(tài)系統(tǒng)內(nèi)的許多平臺(watchOS、tvOS、iPadOS、macOS),因此 Flutter 只能帶你入個門而已。
當(dāng)然,使用 Cupertino 小部件可以解決部分問題,但是……
正如我剛剛指出的,Android 同時提供 Cupertino 和 Material 小部件。
這的確很不錯,但這也意味著,如果你希望應(yīng)用程序看著像原生一樣(順便說一句,React Native 是做得到的),你還得使用正確的小部件集來完成工作。這可能意味著界面的某些部分需要寫兩次代碼。
更不用說你可能還必須為各個平臺針對性地重組應(yīng)用的各個部分,以適應(yīng)平臺的外觀和風(fēng)格(這個平臺要求導(dǎo)航欄在標(biāo)簽欄內(nèi),那個平臺正好相反,諸如此類的問題)。
是的,你可以重用業(yè)務(wù)邏輯,但是我認(rèn)為這并不能解決在兩個平臺上編寫、測試和調(diào)試用戶界面的問題。
一些人在評論中還提到 Flutter 可用于 Web,因此你可以免費獲得“另一個”平臺。
是的,你可以將 Flutter 用于 Web……盡管 Web 版本仍然處于 beta 階段,甚至谷歌在大多數(shù)情況下都不推薦使用它。
目前,并非每種 HTML 場景都適合用 Flutter 編寫。例如,博客文章之類基于流的富文本內(nèi)容更適合以文檔為中心的模型,這種模型是 Web 的基礎(chǔ);而像 Flutter 這樣的 UI 框架可以提供的是以應(yīng)用為中心的服務(wù),和前者并不相稱。
因此,是的,如果你想做一些數(shù)據(jù)可視化、制作一個在線工具(例如汽車配置器),或者制作某種嵌入式圖表(同樣也是谷歌推薦的用例),那都沒問題。
問題是,我們不是剛剛將一些沉重的、非 HTML 的應(yīng)用渲染技術(shù)趕出了互聯(lián)網(wǎng)嗎?
盡管 Flutter 的支持和文檔狀況略有改善,但遠(yuǎn)遠(yuǎn)無法和在 iOS 或 Android 上進(jìn)行原生應(yīng)用開發(fā)時獲得的支持相提并論。
想要關(guān)于 Swift、Java、Kotlin、Cocoa 的文章、書籍、視頻和課程?隨便就能找到一大堆。
需要在 Stack Overflow 上求助嗎?你想問的任何問題幾乎都已經(jīng)被問過并得到回答了。
但是 Flutter 呢?就沒那么多了。
從評論中可以看出這一點:
單說支持問題就很讓人頭疼,尤其是在 Android 上(依賴地獄足以與 Windows 上 90 年代中期到 00 年代初的“DLL 地獄”相媲美)。
谷歌拋棄自己曾經(jīng)熱捧技術(shù)的歷史可謂臭名昭著,誰都沒法否認(rèn)這一點。而且,如果谷歌哪天認(rèn)為 Flutter 不會取得回報,那么棄之如敝屣也毫不奇怪。
谷歌是在推廣 Flutter,但同時他們也在推廣 Kotlin 上的 Jetpack Compose,甚至 Kotlin Native Common 模塊,以提供跨平臺支持。
更不用說蘋果也在推進(jìn)自己的下一代聲明式開發(fā)技術(shù):SwiftUI。盡管它和 Flutter 不能直接對比,因為它不能用來創(chuàng)建 Android 應(yīng)用,但是 SwiftUI 確實能讓開發(fā)人員一次性支持所有蘋果平臺:iOS、iPadOS、macOS、watchOS 和 tvOS。
如果兩種技術(shù)都能達(dá)到預(yù)期的效果,并且都大大減少了開發(fā)原生應(yīng)用程序所需的時間,那么 Flutter 究竟還剩下什么優(yōu)勢可言呢?
Flutter 的最大缺點之一是其實現(xiàn)語言 Dart。
如果你在運行谷歌的 Web 或后端托管環(huán)境,那么 Dart 是你可以使用的一種語言,僅此而已。這意味著,如果你為了 Flutter 而花時間去學(xué)習(xí) Dart,那么很有可能那些來之不易的經(jīng)驗唯一能發(fā)揮價值的場所就是 Flutter。
后一點可能是最讓人望而卻步的。我的意思是說,如果我想成為一名移動開發(fā)人員,我可能會學(xué)習(xí) Swift 或 Kotlin,因為它們都是現(xiàn)代語言,而且實際上兩者都有很多就業(yè)機(jī)會。
Dart 呢?顯然沒那么多。
嚴(yán)格來講 Dart 并不難學(xué),但這主要是因為它是一種簡單的語言。正如另一位評論者所指出的:
學(xué)習(xí)了 Swift 和 Kotlin 之后,Dart 感覺像是在開倒車。它缺少許多其他現(xiàn)代語言可用的特性。它的類型系統(tǒng)不是很好。設(shè)計 Dart 的人似乎有一個“讓 JS 開發(fā)人員輕松使用”的設(shè)計目標(biāo)。Dart 的邊緣也很粗糙,就像 Javascript 一樣;而 Swift 和 Kotlin 在所有重要細(xì)節(jié)上都感覺很精致、成熟和完整。
Dart 缺乏市場滲透力,這意味著如果你的團(tuán)隊中需要更多 Dart 開發(fā)人員,可能人都招不到。反過來說,這意味著你只能自己培養(yǎng)人才。這當(dāng)然可以做到,但在他們還沒成長起來之前你仍然要為他們開工資。
最后請記住,在某個時候,你可能會遇到框架的局限性(或需要移植到更多平臺上),然后你無論如何都要退下來,并做一些原生開發(fā)的工作。
在這種情況下,你仍然需要學(xué)習(xí) Swift 和 Kotlin。
作為可能的解決方案,我們曾幾次將 Flutter 推薦給客戶,而客戶一直反對這種想法——尤其是當(dāng)他們想利用自己內(nèi)部的 JavaScript 開發(fā)人員時,就像我前面提到的那樣。
但請放心:他們也提到了我上面列出的幾乎所有問題。
上面談到的這些內(nèi)容可能會讓你相信,F(xiàn)lutter 可能不是你項目的最佳選擇。
但我并不是這個意思。你只需要認(rèn)識到它的局限性即可。
在我看來,F(xiàn)lutter 最適合小型內(nèi)部開發(fā)團(tuán)隊,這些團(tuán)隊需要快速創(chuàng)建概念驗證應(yīng)用,而這種應(yīng)用在外觀和設(shè)計上基本上都是非原生的。
一個可能的例子是兒童游戲或應(yīng)用,它們有著獨特的界面,而且外觀上肯定不是原生的。在這種情況下,F(xiàn)lutter 并不能完全模仿 iOS 和 Android 體驗的問題就顯得無關(guān)緊要。我在上文提到的需要編寫兩次界面的問題也不復(fù)存在。
哦,你還需要一個不介意學(xué)習(xí)全新平臺和語言的團(tuán)隊。
那么……結(jié)論很明顯了。
Flutter 是一項很酷的技術(shù),但在大多數(shù)情況下,它沒法成為舞臺上的主角。
再說一遍,本文只是一種見解。歡迎不同意見,你可以在下面的評論中發(fā)表自己的意見。(實際上,其中一些要點已經(jīng)在文章中反饋了。)
另請注意,我不是 React Native 的粉絲。React 遇到了許多相同的問題,此外還帶來了一些重大的性能損失。
最后補(bǔ)充一下:我并不是說 Flutter 沒有合適的使用場景。但是,與已知領(lǐng)域中的其他事物一樣,它也存在一些折衷和已知的局限。最后你必須決定你和你的組織是否愿意給這種技術(shù)長期下注。
感謝閱讀。
https://medium.com/better-programming/why-flutter-isnt-the-next-big-thing-e268488521f4
這本《Flutter技術(shù)解析與實戰(zhàn)》并非基礎(chǔ)知識的簡單羅列,而是從一線問題出發(fā),循序漸進(jìn),娓娓道來。它從通用業(yè)務(wù)工程化開始,進(jìn)而展開Flutter在閑魚整體云端一體化架構(gòu)的創(chuàng)新思考。—— 阿里巴巴資深技術(shù)專家 孫兵(酒丐) 長按二維碼秒關(guān)注
回復(fù)”Flutter技術(shù)“ 獲取最新PDF
長按二維碼2秒關(guān)注
掃碼加我微信進(jìn)群,內(nèi)推和技術(shù)交流,大佬們零距離




