作者 / 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_preferences、path_provider、url_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 开发者社区中文资源