在這篇文章中,我將分享我使用 Flutter 的經(jīng)驗,以及我在整個過程中發(fā)現(xiàn)的所有 Flutter 的優(yōu)缺點。
在過去的一年里,我是如何使用 Flutter 的呢?我做了以下這些事情:
使用 Flutter 重寫一款已經(jīng)發(fā)布到 App Store 的 iOS 應(yīng)用程序。
開發(fā)了一個 Flutter 免費(fèi)速成課程,錄制 5 個多小時的教學(xué)視頻內(nèi)容。
使用 Flutter 開發(fā)一些小型尚未發(fā)布的應(yīng)用程序。
1,Dart 易學(xué)易用
與 Type 或 Flow 相比,Dart 更容易學(xué),語法也更簡單。我能夠快速地進(jìn)行開發(fā),因為編譯器提供了明確的錯誤消息,具有更少隱藏的非預(yù)期運(yùn)行時錯誤。在開發(fā)中型應(yīng)用程序時,開發(fā)人員應(yīng)該擁抱強(qiáng)類型語言,因為它在加快開發(fā)速度和編寫可靠代碼方面起到很大作用。
2,偶爾還要“自己動手”
在采用新技術(shù)時,有時候需要“推出自己的”庫,以便與第三方服務(wù)集成。例如,為了在我的應(yīng)用程序中集成 Mixpanel(因為它們提供了一個免費(fèi)套餐選項和一個非常簡單清晰的 UI),我不得不開發(fā)我自己的庫 pure_mixpanel(https://pub.dartlang.org/packages/pure_mixpanel)。這不是什么大不了的事情,實際上它很有趣。我個人在使用 scoped_model 方面有很多成功的經(jīng)驗,它很好地抽象出需要使用流的地方,并且很像 React 的新 Context API。你可以干凈利落地將業(yè)務(wù)邏輯和渲染邏輯完美地分開,并且它非常容易學(xué)。
3,架構(gòu)和狀態(tài)管理模式還不夠成熟
首先,F(xiàn)lutter 是一項新技術(shù),因此在實際應(yīng)用、可信的架構(gòu)模式和狀態(tài)管理工具方面仍然有待發(fā)展。有些人會遵循“BLoC”(或“業(yè)務(wù)邏輯組件”,https://www.youtube.com/watch?v=fahC3ky_zW0)模式。在我看來,它有點太過復(fù)雜了,而且有些復(fù)雜性是不必要的。還有 RxDart(https://github.com/ReactiveX/rxdart)和 Redux for Flutter(https://pub.dartlang.org/packages/flutter_redux),不過我還沒有用過它們,因為它們看起來也過于復(fù)雜了。但是,Android 或 React 開發(fā)者似乎有很多成功使用它們的經(jīng)驗,他們可能已經(jīng)習(xí)慣使用它們了。
我認(rèn)為整個生態(tài)系統(tǒng)在 2019 年會更加成熟,因為越來越多的人正在開發(fā)越來越復(fù)雜的 Flutter 應(yīng)用程序。
4,熱重載仍然很重要
關(guān)于這一點沒什么好說的,只是 Flutter 的這個特性太重要了,所以有必要在這里單獨提及。它更快,也更可靠
5,跨平臺設(shè)計很難
Material Design 非常棒,對于某些類型的 Web 應(yīng)用程序和 Android 應(yīng)用程序來說,它都是一個明智的選擇。但對于 iOS 用戶來說并不是一個好主意,除非它是谷歌應(yīng)用程序或非常簡單的東西,iOS 用戶已經(jīng)習(xí)慣使用 CocoaTouch 風(fēng)格的 UX。在基于同一個代碼庫開發(fā)兩個平臺的應(yīng)用程序時,越來越多的人使用某種定制的自定義設(shè)計,并引入了常見的設(shè)計元素(例如標(biāo)簽欄)。盡管 Flutter 也提供了大量 iOS 風(fēng)格的小部件,但為了降低代碼的維護(hù)成本,大多數(shù)人選擇定制 Flutter 的 Material Design 庫,這實現(xiàn)起來非常容易。我想再寫一篇有關(guān)這個主題的文章,我的建議是堅持使用 Material Design,讓那些 iOS 用戶不會覺得太“像 Android”了。例如表單,使用 Material Design 的樣式來裝扮表單字段,對兩種類型的用戶來說都足夠熟悉。
6,使用 Flutter 實現(xiàn)復(fù)雜的布局其實容易
我習(xí)慣使用 React、CSS Grid、Flexbox 等庫來實現(xiàn)布局。Flutter 的布局方式從這些工具中獲取了很多靈感。如果你已經(jīng)熟悉這些基于 Web 的布局概念,那么學(xué)習(xí) Flutter 的布局就會非常簡單。即使不熟悉,學(xué)起來也很容易。如果你想感受一下,可以看一下這個視頻:https://fluttercrashcourse.com/lessons/container-layout-column-row。此外,Dart 和 Flutter 的 UI 邏輯在代碼可讀性方面表現(xiàn)得都非常出色。總的來說,我更喜歡自己實現(xiàn)布局,而不是使用 JSX 之類的東西。它讓我想起了 Swift 和 iOS 中的布局邏輯是多么的簡單,如果你是通過編程的方式實現(xiàn)布局的話。
7,將會有更多端到端的應(yīng)用示例
雖然現(xiàn)在有很多與 Flutter 相關(guān)的文檔、教程、社區(qū),但我認(rèn)為人們對小部件的關(guān)注有點過頭了。這點是可以理解的,畢竟 Flutter 還很年輕。但是,最終越來越多的人不僅用 Flutter 來實現(xiàn)純粹的 UI 和動畫,而且還會用來開發(fā)更多完整的應(yīng)用程序。我認(rèn)為,F(xiàn)lutter 的網(wǎng)站上將會有更多端到端的示例教程。我學(xué)會了使用 Flutter 開發(fā)整個應(yīng)用程序,而不僅僅是小部件。我發(fā)現(xiàn)了很多非常有用的 Dart 高級功能。我提到的架構(gòu)模式也是值得你去深究的。最后,與 Web 服務(wù)集成和其他 Dart 最佳實踐仍然需要更多的文檔和教程。
8,我的下一個項目將使用 GraphQL 或 gRPC
我總是希望能夠減少樣板代碼的使用,雖然有一些工具(https://flutter.io/docs/development/data-and-backend/json)可以幫我解決這個問題,但對于我的下一個項目,我將使用 GraphQL 或 gRPC。我認(rèn)為對這兩項技術(shù)的投入都是值得的。至于 gRPC,我不推薦將它用于較小的項目,但對于中型或大型項目,一旦你用了它,就很難再退回去了。gRPC 在我的一個使用 Swift 開發(fā)的項目中非常有效,已經(jīng)在生產(chǎn)環(huán)境中運(yùn)行了好幾年。
9,提交應(yīng)用程序都非常簡單
為每個平臺提交應(yīng)用程序所需的工具和步驟需要花一些時間來學(xué)習(xí),特別是谷歌 Play 商店和 iTunes Connect,但其實它們非常簡單。
10,F(xiàn)lutter 提供了太多的小部件
我之前學(xué)習(xí)了所有我認(rèn)為必須學(xué)習(xí)的小部件,但最終只使用了大約 20%。例如,Center 小部件(https://docs.flutter.io/flutter/widgets/Center-class.html)。為什么要單獨使用一個小部件來讓元素居中?雖然它讓新手很容易上手,但在用它實現(xiàn)更復(fù)雜的布局時,會產(chǎn)生太多嵌套的 Dart 代碼。相反,我會選擇基本的 Container 布局(https://docs.flutter.io/flutter/widgets/Container-class.html),因為它們非常靈活。我的建議是專注于基本的簡單小部件,只有到了真正需要的時候才去了解更多的小部件。
11,放棄 Firebase(只用來實現(xiàn)推送通知)
Firebase 看起來像是一款出色的產(chǎn)品,它讓我想起了之前的 Parse(https://parseplatform.org/)。對于簡單的項目,或者在后續(xù)需要將項目移交給沒有足夠?qū)I(yè)開發(fā)人員的客戶來說,它似乎是一個不錯的選擇?,F(xiàn)實情況是,大多數(shù)公司都已經(jīng)有自己的后端,還有一些技術(shù)團(tuán)隊選擇自己開發(fā)后端。大型公司或初創(chuàng)公司傾向于這么做。對于獨立開發(fā)者,如果你的流量激增,能承受每月的 Firebase 賬單嗎?這實際上也是我避免使用 Firebase 的主要原因,因為如果我遇到了病毒傳播式的“夢想問題”,并且 Firebase 根據(jù)使用情況收取費(fèi)用,我將如何應(yīng)對?因為我是以開發(fā)后端系統(tǒng)為生,所以會存在這樣的偏見。如果你是初級開發(fā)人員,你開發(fā)的后端到最后會移交給客戶,或者你不開發(fā)后端 API,那么我仍然會強(qiáng)烈建議你關(guān)注 Firebase。
12,F(xiàn)lutter 的文檔越來越好了
窗口小部件和類文檔現(xiàn)在有越來越多的示例:https://docs.flutter.io/flutter/widgets/Container-class.html,相比其他缺乏文檔的庫,這是 Flutter 的一個勝利,而且更不用說編寫良好的文檔了。除了文檔之外,在去年的大部分時間里,Stack Overflow 上有很多熱情、知識淵博的人為我提供了幫助。
13,我被 iOS 和 Flutter 的開發(fā)體驗寵壞了
我從事 iOS 開發(fā)已經(jīng)很多年了,所以我有點被 iOS 的開發(fā)者體驗寵壞了。不只是文檔和支持,還有 iOS 生態(tài)系統(tǒng)的整體質(zhì)量,從庫到 Xcode,再到 CocoaTouch SDK 的組織方式。Flutter 也提供了類似的體驗。它也非常簡單,同時也借鑒了某些 React Native 組件的簡單性,比如 ListView。所以,整體來說,有了成熟的工具的配合,學(xué)習(xí)和使用 Flutter 會非常順利。
14,無法回到“單平臺”移動開發(fā)
視頻游戲開發(fā)人員可能永遠(yuǎn)不會考慮單獨為一個平臺開發(fā)一個代碼庫。現(xiàn)在,因為 React Native 和 Flutter 的出現(xiàn),“非視頻游戲”開發(fā)人員也可以這么做。例如,在空閑時間,我會與妻子(她是一名用戶體驗設(shè)計師)一起開發(fā)應(yīng)用程序。將 iOS 應(yīng)用程序轉(zhuǎn)為 Flutter 后,我們的用戶翻了一倍,現(xiàn)在它已經(jīng)運(yùn)行在兩個平臺上,所以無法再回到單平臺上。
15,最后的想法
經(jīng)過一年的折騰,當(dāng)我開始開發(fā)下一個 Flutter 應(yīng)用程序時。我非常慶幸將時間花在學(xué)習(xí) Fluttet 上。對于企業(yè)來說,現(xiàn)在有了一種可用于開發(fā)多平臺應(yīng)用程序的選項,而對于開發(fā)人員來說,使用它是一種樂趣。如果你將這個事實與谷歌在 Fuschia 操作系統(tǒng)上對 Flutter 所做的投入相結(jié)合,你就可以知道,這些事實本身就表明谷歌非常重視這項技術(shù)。
英文原文:https://hackernoon.com/one-year-with-flutter-my-experience-5bfe64acc96f