原標題:更方便、更強大: Flutter package 生態系統更新

作者 / Chris Sells,Flutter 開發者體驗產品經理

Google Flutter 團隊只有一個工作目標: 讓開發者在多個平臺上都能構建精美的原生應用。在 Flutter 剛誕生時,我們通過專注於滿足少數初始用戶的需求達成了這一目標。這一階段的成果就是用於呈現文本和圖形的便於移植的渲染引擎。接下來的目標是拓展受衆,我們通過高效的工作流程,結合強大的 Dart 平臺,以及易用且能在 Android 和 iOS 上進行原生編譯的 Flutter API 吸引了大量的開發者。隨着用戶羣體的擴大,用戶們的需求也在增加,這也促使我們在 Dart 的 pub.dev 平臺上提供 Flutter package 管理和發現機制,從而將 package 作者和用戶緊密地聯繫在一起。

這最後的一步也是特別重要的一步。做到這一點就意味着 Flutter 社區可以在不依賴 Flutter 團隊的情況下實現互幫互助。現在任何人在 pub.dev 上發佈或使用 package 之前,都 再需要四處詢問了。另一方面,要培養這種生態系統,就需要一個值得信賴的角色來打造現代 Flutter 應用開發的基礎設施。Google 的 Flutter 團隊正好負責解決這個問題: 提供值得信賴的平臺,讓 Flutter 社區繼續發展壯大。

Package 的發佈者認證、評分和 Favorite 項目

爲了提升 Flutter package 生態系統的可信度,我們在 pub.dev 上給出了 package 的一些評價指標:

這是 provider package的頁面截圖,這個 package 在 Flutter 生態中的人氣和質量都位居前列。這張截圖包含了一些我們在 pub.dev 上用以展示 package 質量的信息。首先是域名左邊的藍色盾牌圖標,它代表 Verified Publisher(認證發佈者),即這個 package 是由經過身份驗證的作者發佈的。接下來往右一點是點贊圖標和點贊數,讓您可以知道這個 package 在社區用戶間受歡迎的程度。最後是截圖最右邊的 Flutter Favorite 徽章,看到這個徽章就意味着您在構建應用的時候應該首先考慮使用這個 package。這裏給出一個對比: 一個在過去三個月內積極維護的 package 平均會收到 12 個贊,而 Flutter Favorite package 則是 270 個。爲了確保找到質量最佳的 package,Flutter Favorite 衡量指標會綜合考慮諸多要素: 包括 pub.dev 評分,各種主觀及客觀的質量、可用性和適用性指標,以及由 Flutter 框架作者之一來進行的工程代碼審查結果。

  • provider package

    https://pub.flutter-io.cn/packages/provider

  • Verified Publisher

    https://dart.dev/tools/pub/verified-publishers

  • Flutter Favorite 衡量指標

    https://flutter.dev/docs/development/packages-and-plugins/favorites#metrics

由於 Flutter Favorite 的判定標準十分嚴格,所以帶有這個徽章的 package 也會十分稀少。今天我們特別宣佈,下面這些 package 加入了 Flutter Favorite 陣容:

  • bloc

    https://pub.flutter-io.cn/packages/bloc

  • flutter_bloc

    https://pub.flutter-io.cn/packages/flutter_bloc

  • convex_bottom_bar

    https://pub.flutter-io.cn/packages/convex_bottom_bar

  • geolocator

    https://pub.flutter-io.cn/packages/geolocator

  • google_fonts

    https://pub.flutter-io.cn/packages/google_fonts

  • location

    https://pub.flutter-io.cn/packages/location

  • sign_in_with_apple

    https://pub.flutter-io.cn/packages/sign_in_with_apple

恭喜這些 package 的作者,也非常感謝大家對 Flutter package 生態系統做出的貢獻。

  • Flutter Favorite package 完整列表 https://pub.flutter-io.cn/flutter/favorites

通過 Apple 登錄

在這次贏得 Flutter Favorite 榮譽的插件中,最引人注目的是 sign_in_with_apple插件。

  • sign_in_with_apple 插件

    https://pub.flutter-io.cn/packages/sign_in_with_apple

該插件不僅質量高、適用性廣,而且還填補了 Flutter 功能清單中的一項重要空白。Apple 已經聲明,所有使用了其他第三方登錄方式,如 Google Sign In 等的應用,都必須在 2020 年 6 月 30 日之前同時提供 Apple Sign In,這樣才能發佈到 App Store。顯然,通過 Apple 登錄對於任何在 iOS 上開發應用的 Flutter 開發者來說都是至關重要的功能,但這次並不是由 Google 的 Flutter 團隊提供,而是藉助社區的力量。在與 sign_in_with_apple 的作者 Timm Preetz 和 Henri Beck 溝通後,他們的反應非常迅速,在極短的時間內將插件打磨到了我們需要的水準。

  • Apple 的聲明

    https://developer.apple.com/news/?id=03262020b

質量與數量並重

Flutter package 生態系統的成熟和多元,是我們攜手社區打造出諸如 sign_in_with_apple 等插件的堅實基礎。事實上,依賴 Flutter 的插件數量隨時間增加的過程,也是生態系統成長的過程。

△ 自 1.0 版本發佈以來依賴 Flutter 的 package 數量

通常情況下,如此驚人的數量增長都會伴隨着整體質量的下滑。然而,從 Flutter 社區看到的趨勢正好相反。

△ 自 1.0 版本發佈以來依賴 Flutter 的

高質量 package 百分比

這裏我們將 pub.dev 上整體評分中的健康度和維護狀況作爲質量指標。大家可以看到,自 Flutter 1.0 發佈以來,不僅 package 數量迎來了巨大的增長,其生態系統的整體質量同樣有很大的提升。

爲 Google Flutter 插件的 1.0 版本做好準備

開發插件的不僅僅是社區。Google 內部團隊也爲 Flutter 維護了 一系列插件。這些插件中有許多都被標記爲 Flutter Favorite 以展示其高質量,包括 shared_preferencespath_providerurl_launcher等等。但這些插件並沒有全部都被標註爲 "1.0" 版本,例如,shared_preferences 的版本就是 "0.5.7+2"。對於想在生產環境中使用插件的開發者來說,這樣的版本號並不直觀,而這個現象則是由 Dart 處理版本的方式造成的:

  • Google Flutter 插件

    https://pub.flutter-io.cn/publishers/flutter.dev/packages

  • shared_preferences

    https://pub.flutter-io.cn/packages/shared_preferences

  • path_provider

    https://pub.flutter-io.cn/packages/path_provider

  • url_launcher

    https://pub.flutter-io.cn/packages/url_launcher

按照慣例,我們建議開發者在設置 package 依賴時使用脫字號 (caret,即 "^" 符號) 語法,比如: ^current-version。這個寫法會被 flutter pub get 解讀爲 "我想使用不低於我指定版本號的最高版本,但不要升級到下一個大版本"。這也是 Dart 實現 語義兼容做法,即,大版本用於處理重要改動 (breaking change),需要開發者明確設置依賴。但在 Google 維護的這些 Flutter 插件中,我們已經穩定了 API,所以將版本指定爲 1.x 是安全的。您可以在 pubspec.yaml 中這樣設置:

dependencies: shared_preferences: '>=0.5.7+2 <2.0.0'
  • 語義兼容

    https://semver.org/

  • Dart 的語義兼容實現

    https://medium.com/@nex3/pubgrub-2fb6470504f

對於下列插件,您可以用表格中給出的版本字符串來爲 v1.0 版本做好準備:

如果您的 pubspec.yaml 沒有按照上表進行更新,那麼當我們升級到 1.0.0 版本時,您的應用還有依賴的 package 就不會得到更新。在 1.0 版本里這不會有什麼問題,因爲 package 和上面列出來的 0.x 版本是一樣的,但在升級到 1.1 或更高版本後呢?這也是爲什麼您需要按照上表修改 pubspec.yaml 的原因。

在某些情況下,我們也會直接提供幫助。比如,現在 pub.dev 上有 181 個依賴 shared_preferences 的 package。如果您的應用依賴於 shared_preferences <2.0.0,同時還依賴於另一個 package,而它依賴 shared_preferences <1.0.0,那 Dart 的版本求解器永遠不會爲您升級到 1.0.0 (或 1.1.0 等更高的版本)。但您不必坐等這 181 個 package 作者看到這篇文章後更新他們的版本依賴字符串,我們正在針對這些 package 的 pubspec.yaml 主動提交 PR,從而使其中的版本字符串符合上表中的要求。這樣當我們將 Google Flutter 插件的版本號從 0.x 更新到 1.0.0 時,您的應用以及依賴的 package 都會工作正常。

將 Google Flutter 插件推進至正式版

您可能已經注意到,我們沒有在上面的討論中提及到全部的 Google Flutter 插件,包括 Firebase、Camera、Video Player 等等。這是因爲我們還需要進一步打磨這些插件,使他們達到正式版本的品質;比如 Firebase 插件就需要更好、更全面的文檔,以及更快的構建速度,並且降低其設置難度。我很高興地宣佈,我們正在與英國的 Invertase合作達成這個目標,這家諮詢公司在 Dart 和 Flutter 方面有着豐富的經驗。

  • Invertase

    http://invertase.io

在接下來的幾個月裏,Invertase 將幫助我們把剩下的 Google Flutter 插件推進到正式版本的品質。如果您需要了解 Firebase 插件的詳細情況,請閱讀 Invertase 在 FlutterFire repo中給出的詳細說明。

  • FlutterFire repo

    https://github.com/FirebaseExtended/flutterfire/issues/2582

小結

Flutter 的 package 生態正在蓬勃發展,雨後春筍一般出現的 package 填補了 Flutter 生態中的諸多空白,如果只靠 Google 的 Flutter 團隊的話是不可能管理如此豐富的內容的。幸運的是,現在我們有了 pub.dev 上的各種指標,包括評分、評級和 Flutter Favorite,還擁有了來自 Invertase 的鼎力相助,您完全有理由充滿信心,相信自己可以在這個生態中找到適合自己下一個 Flutter 應用的 package。有了 pub.dev 中海量 package 提供的無限可能,您會打造出怎樣精彩的作品呢?

訪問 Flutter 開發者社區中文資源

相關文章