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