查看原文
其他

更方便、更强大: Flutter package 生态系统更新

Flutter 谷歌开发者 2021-08-05

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



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存