[譯] 我與 Flutter 的一年

ssshooter發表於2019-02-06

[譯] 我與 Flutter 的一年

這是 Flutter 美好的一年。

大概剛好一年前,我寫了一篇名為「為什麼 Flutter 2018 年即將起飛」的文章。雖然 Flutter 幾乎經過整個 2018 年的測試階段才達成現在的 1.0 版本,但是它的社群和產品已經在這個過程中得到了飛速的成長,現在 Flutter 已經進入 GitHub 倉庫 star 排名前 20。而這篇文章,介紹的是我一年來使用 Flutter 的經驗,以及我在此過程中發現的 Flutter 的優缺點

過去一年我用 Flutter 做了什麼:

  • 使用 Flutter 重寫了一個之前就已經上架 App Store 的 iOS 應用
  • 釋出免費 Flutter 速成課,錄製超過 5 小時的教學視訊。
  • 使用 Flutter 開發了一些尚未釋出的小應用。

在我列出我的想法之前,先介紹一下我的技術背景,就移動開發來說我是 iOS 開發。另外,去年我在日常工作中也大量使用了 React Native。我不打算將 Flutter 與這些技術進行比較,但這些移動開發經驗確實會影響我對 Flutter 的印象。

然後,以下就是我使用 Flutter 一年來學到的:

1. Dart 簡單易學,愉快使用

相比去年我在 React Native 開發中廣泛使用的 TypeScriptFlow,Dart 更容易學習,語法更簡單。我能夠高效開發應用,必不可少的是可靠的編譯器,它有明確的,定義良好的錯誤訊息,極少的意外隱藏執行時錯誤。如果有足夠多的人希望瞭解相關內容,我會寫一篇更詳細的例子比較。我要說的是,即使是編寫中等規模的應用程式,開發人員也應該考慮強型別語言,因為這為高速開發和編寫可靠程式碼節省了大量時間。

2. 有時候仍然需要「自己動手」

涉及新技術的另一個常見情況是:需要「自己動手」寫一個庫對接第三方服務。例如,要使用 Mixpanel 分析我的應用程式(因為他們大方地給出了免費套餐,並且 UI 簡單,清晰),我不得不自己動手封裝一個庫:pure_mixpanel,這不難,而且很有意思。

我使用 scoped_model 獲得了不錯的實踐,因為它很好的去掉了流的使用,使用方法很像 React 剛更新的 Context API。你可以乾淨利落地將業務邏輯和渲染邏輯完美地分開,並且非常容易上手。

3. 架構和狀態管理模式仍未成熟

Flutter 是一項新技術,因此在實踐、架構模式和狀態管理等方面仍然難以獲得足夠的意見。有些人遵循「BLoC」(business logic component)模式。因為我認為它有點過於的複雜,所以仍未確定使用它。還有 RxDartRedux for Flutter,這兩個我還沒用過,因為它們似乎也太麻煩了。另一方面,Android 或 React 工程師似乎有不少成功實踐,可能是因為他們已經習慣這種模式。

我認為整個生態系統將在 2019 年成熟,因為越來越多的人正在編寫更復雜的 Flutter 應用程式。

4. 熱過載是個重點

關於這一點其實沒什麼好說的,Flutter 這個特性的重要程度,足以在本文增加這一節。Flutter 熱過載很快,而且更可靠。對於其他技術的熱過載,我真不敢這麼說(告訴自己我沒有黑其他技術)。

5. 跨平臺設計不容易

Material Design 很美好,可以讓我們快速起步。顯然對於某些型別的 web app 以及 Android 應用來說是個不錯的選擇,但是將它呈現給 iOS 使用者並不是一個好主意,除非它是谷歌應用或其他非常簡單的應用。iOS 使用者習慣使用 CocoaTouch 風格的 UX。

「一次編寫隨處執行」、定製的自定義設計、引入設計常見的設計元素(例如,標籤欄)等情況越來越普遍。儘管 Flutter 確實提供了大量 iOS 風格的 widget,但為了使程式碼易於維護,大多數人會使用封裝定製後的 Flutter 的 Material Design 庫,這是很容易實現的。

我將撰寫另一篇關於這個主題的文章,但我的建議是堅持使用 Material Design,可以在某些方面,試著讓那些 iOS 使用者覺得不那麼「安卓」。以表單為例,使用 Material Design 樣式的表單欄位對兩種型別的使用者都是足夠熟悉的。

6. 在 Flutter 中實現複雜佈局很簡單

我習慣使用 React、CSS Grid、Flexbox 等庫來實現佈局。Flutter 的佈局方法從這些庫中借鑑了許多。如果你已經熟悉這些基於 Web 的佈局概念,那麼學習 Flutter 佈局將會非常簡單。即使不懂 Web 佈局,它仍然很簡單。如果你想感受一下 Flutter 的佈局方法,可以觀看此視訊

此外,從程式碼可讀性的角度來看,Dart 和 Flutter 中的 UI 邏輯非常出色。總的來說,比起 JSX 我個人更喜歡這種佈局方式。它讓我想起了 Swift 和 iOS 中簡單的佈局邏輯(如果你是以程式設計方式實現佈局的話)。

7. 仍然需要更多關注端到端應用示例

雖然有大量可靠的文件,教程,社群以及與其他 Flutter 使用者的幫助,但是這些都太著重於 widget 了。Flutter 剛出來時這確實很必要。但最終,越來越多的人不僅僅是實現純 UI 和動畫,而是開始編寫更多更完善的應用程式,我認為 Flutter 的網站上應該突出介紹更多的端到端教程。這也是我自己開設課程網站的主要原因。

我學習編寫 Flutter 應用並不侷限於僅僅使用控制元件。我發現有許多更高階的 Dart 功能非常有用,你必須挖掘它們。我提到的架構模式也值得挖掘。最後,整合 Web 服務和其他 Dart 最佳實踐整合仍需要更多文件和教程。

8. 下一個專案我將使用 GraphQL 或 gRPC

我總是爭取更少的模版程式碼。雖然某些工具在一些簡單專案中解決了我的問題,但我想我的下一個專案我會使用 GraphQLgRPC。我認為對這兩者的投入都是值得的。關於 gRPC,我不推薦將它用於較小的專案,但對於中大型專案,一旦你使用它,就會愛上它。gRPC 在我的一個 Swift 專案行之有效,已經投入生產環境執行好幾年了。

9. 在兩個平臺提交應用程式都很簡單

你需要一定時間習慣為每個平臺(特別是 Google Play 商店和 iTunes Connect)提交應用程式所需的工具和步驟,但這非常簡單。我會說為 iOS 提交應用程式肯定更符合學習曲線。

10. Flutter 有太多的 widget

在 Flutter 應用開發過程我認為有必要學習的那些控制元件中,實際被我用到的大概只有 20%。例如 Center widget,為什麼需要一個具備使子控制元件居中這樣單一功能的控制元件?雖然它使新手很容易上手,但是在實現複雜的佈局時,widget 會產生太多巢狀的Dart程式碼。相反,我會回到基本的 Container 佈局,因為這相比起來更靈活。

我的建議先關注於簡單,基本的 widget,真正需要時再學習其他 widget。

11. 我正在從 Firebase 轉移(推送通知除外)

Firebase 似乎是一款出色的產品。它讓我想起了當年的 Parse。Firebase 對這些情況是比較好的選擇:簡單的專案,或者你將要把專案移交到沒有足夠後端技術人員的客戶時。

但事實上,大多數產品已經有現成的後端,或者技術團隊編寫自己的後端。不管大型公司或者甚至是初創企業都是如此。

對於獨立開發者或小團體,如果你的流量激增,每月 Firebase 賬單會發生什麼變化?這就是我避免使用 Firebase 的主要原因,如果我的應用真的如夢想一般被使用者瘋傳,Firebase 找我要錢怎麼辦?

請注意,我的職業是編寫後端系統,所以這僅僅是我的個人看法。如果你是初級開發人員,想要將簡單的後端交付給客戶,或者你只是不想編寫後端 API,我仍然推薦使用 Firebase。

12. Flutter 的文件越來越完善

Widget 和 class 文件現在有越來越多的示例(例如)。這是對比其他缺乏適當示例的庫是巨大的優勢,更不用說編寫良好的文件了。

除了文件之外,去年 Stack Overflow 上還有很多熱情、知識豐富的人為我提供技術支援。

13. 即使被 iOS 開發慣壞了,也能使用 Flutter

我當 iOS 工程師很多年了,所以我有點被 iOS 開發慣壞了。不僅是文件和支援,還是 iOS 生態系統的整體質量,從庫到 Xcode,再到 CocoaTouch SDK 的組織方式。

Flutter 也符合我之前的體驗。它也非常簡單,同時也考慮了某些 React Native 元件的簡單性,比如 ListView(朋友,你使用過 iOS 的 UITableViewController 嗎?Yuck)所以總的來說,有了成熟的工具來配合 Flutter,學習和使用它會非常流暢。不再需要像 Xcode 這樣複雜的工具真的讓人眼前一亮。

14.我不會再回到「單平臺」開發

遊戲開發者可能永遠不會只為一個平臺編寫一套程式碼。React Native 和 Flutter 出現後,「非遊戲開發者」也能做到同樣的事。

例如,在空閒時,我會參與夫妻經營的小專案,與我的 UX 設計師妻子編寫應用程式。Flutter 重構這個 iOS 應用後,使用者基數變為雙倍,現在它已經在兩個平臺上釋出,我肯定不會再考慮回到單平臺了。

最後的想法

一年之後,我將開始編寫下一個 Flutter 應用程式時(之後將會發布記錄開發過程的視訊!),我仍然非常高興我將時間投入到學習 Flutter 中。我現在已經不能回到之前的開發模式。對於企業來說,作為一種用於多平臺編寫技術的可行選擇是有意義的,而且,作為開發人員使用跨平臺技術也是一種樂趣。再加上網頁 Flutter 技術,比如 Hummingbird 以及谷歌為全新 Fuschia 作業系統 長期投入 Flutter,這些事實都表明谷歌注重這項技術。

歡迎隨時通過 Twitter 與我聯絡。另外如果你感興趣,可以看看我的網站 fluttercrashcourse.com 上的免費 Flutter 課程!

2019 程式設計快樂!

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章