使用软件包

Flutter 支持使用其他开发者贡献给 Flutter 和 Dart 生态系统的共享软件包。这允许快速构建应用程序,而无需从头开始开发所有内容。

现有软件包支持多种用例,例如,进行网络请求 (http)、导航/路由处理 (go_router)、与设备 API 集成 (url_launcherbattery_plus),以及使用第三方平台 SDK(如 Firebase (FlutterFire))。

如需编写新软件包,请参阅 开发软件包。如需添加存储在文件或软件包中的资源、图片或字体,请参阅 添加资源和图片

使用软件包

以下部分介绍如何使用现有的已发布软件包。

搜索软件包

软件包发布到 pub.dev

pub.dev 上的 Flutter 着陆页显示与 Flutter 兼容的热门软件包(声明的依赖项通常与 Flutter 兼容),并支持在所有已发布软件包中进行搜索。

pub.dev 上的 Flutter 收藏 页面列出了在编写应用时应首先考虑使用的插件和软件包。如需详细了解成为 Flutter 收藏的含义,请参阅 Flutter 收藏计划

您还可以通过筛选 AndroidiOSWebLinuxWindowsmacOS 或其任意组合来浏览 pub.dev 上的软件包。

向应用添加软件包依赖项

如需向应用添加软件包 css_colors

  1. 依赖它
    • 打开位于应用文件夹内的 pubspec.yaml 文件,并在 dependencies 下添加 css_colors:
  2. 安装它
    • 从终端:运行 flutter pub get
    • 从 VS Code:单击 pubspec.yaml 顶部操作功能区的右侧中显示的下载图标,即 获取软件包
    • 从 Android Studio/IntelliJ:单击 pubspec.yaml 顶部操作功能区的 Pub get
  3. 导入它
    • 在 Dart 代码中添加相应的 import 语句。
  4. 必要时停止并重新启动应用
    • 如果软件包包含特定于平台的代码(Android 的 Kotlin/Java,iOS 的 Swift/Objective-C),则必须将该代码构建到您的应用中。热重载和热重启只会更新 Dart 代码,因此可能需要完全重启应用以避免在使用软件包时出现 MissingPluginException 之类的错误。

使用 flutter pub add 向应用添加软件包依赖项

如需向应用添加软件包 css_colors

  1. 在项目目录中发出命令
    • flutter pub add css_colors
  2. 导入它
    • 在 Dart 代码中添加相应的 import 语句。
  3. 必要时停止并重新启动应用
    • 如果软件包包含特定于平台的代码(Android 的 Kotlin/Java,iOS 的 Swift/Objective-C),则必须将该代码构建到您的应用中。热重载和热重启只会更新 Dart 代码,因此可能需要完全重启应用以避免在使用软件包时出现 MissingPluginException 之类的错误。

使用 flutter pub remove 向应用移除软件包依赖项

要向应用移除软件包 css_colors

  1. 在项目目录中发出命令
    • flutter pub remove css_colors

在 pub.dev 上任何软件包页面上可用的 安装选项卡 是这些步骤的便捷参考。

有关完整示例,请参见下面的 css_colors 示例

冲突解决

假设您想在应用中使用 some_packageanother_package,并且这两个都依赖于 url_launcher,但版本不同。这会导致潜在冲突。避免这种情况的最佳方法是,软件包作者在指定依赖项时使用 版本范围,而不是特定版本。

dependencies:
  url_launcher: ^5.4.0    # Good, any version >= 5.4.0 but < 6.0.0
  image_picker: '5.4.3'   # Not so good, only version 5.4.3 works.

如果 some_package 声明了上述依赖项,而 another_package 声明了一个兼容的 url_launcher 依赖项,如 '5.4.6'^5.5.0,则 pub 会自动解决此问题。对 Gradle 模块 和/或 CocoaPods 的特定于平台的依赖项的解决方式类似。

即使 some_packageanother_packageurl_launcher 声明了不兼容的版本,它们实际上也可能以兼容的方式使用 url_launcher。在这种情况下,可以通过向应用的 pubspec.yaml 文件添加依赖项覆盖声明来解决冲突,强制使用特定版本。

例如,要强制使用 url_launcher 版本 5.4.0,请对应用的 pubspec.yaml 文件进行以下更改

dependencies:
  some_package:
  another_package:
dependency_overrides:
  url_launcher: '5.4.0'

如果冲突的依赖项本身不是一个软件包,而是一个特定于 Android 的库,如 guava,则必须将依赖项覆盖声明添加到 Gradle 构建逻辑中。

要强制使用 guava 版本 28.0,请对应用的 android/build.gradle 文件进行以下更改

configurations.all {
    resolutionStrategy {
        force 'com.google.guava:guava:28.0-android'
    }
}

CocoaPods 目前不提供依赖项覆盖功能。

开发新软件包

如果没有针对您的特定用例的软件包,您可以编写自定义软件包

管理软件包依赖项和版本

为最大程度降低版本冲突的风险,请在 pubspec.yaml 文件中指定版本范围。

软件包版本

所有软件包都有一个版本号,在软件包的 pubspec.yaml 文件中指定。软件包的当前版本显示在其名称旁边(例如,请参阅 url_launcher 软件包),以及所有先前版本的列表(请参阅 url_launcher 版本)。

为确保在更新软件包时应用不会中断,请使用以下格式之一指定版本范围。

  • 范围约束:指定最小版本和最大版本。

    dependencies:
      url_launcher: '>=5.4.0 <6.0.0'
    
  • 使用 插入符号语法的范围约束:指定作为最小包含版本的那个版本。这涵盖从该版本到下一个主要版本的所有版本。

    dependencies:
      collection: '^5.4.0'
    

    此语法与第一个项目符号中指出的语法含义相同。

要了解更多信息,请查看 软件包版本指南

更新软件包依赖项

在添加包后首次运行 flutter pub get 时,Flutter 会将 pubspec.lock 锁定文件 中找到的具体包版本保存下来。这样可以确保如果您或团队中的其他开发者运行 flutter pub get,则会再次获取相同的版本。

要升级到包的新版本(例如,要使用该包中的新功能),请运行 flutter pub upgrade 以检索包的最高可用版本,该版本由 pubspec.yaml 中指定的版本约束允许。请注意,此命令不同于 flutter upgradeflutter update-packages,它们都会更新 Flutter 本身。

对未发布包的依赖

即使没有在 pub.dev 上发布,也可以使用包。对于私有包或尚未准备好发布的包,可以使用其他依赖项选项

路径依赖
Flutter 应用可以使用文件系统 path: 依赖项来依赖包。路径可以是相对路径或绝对路径。相对路径相对于包含 pubspec.yaml 的目录进行评估。例如,要依赖位于应用旁边目录中的包 packageA,请使用以下语法
  dependencies:
  packageA:
    path: ../packageA/
  
Git 依赖
您还可以依赖存储在 Git 存储库中的包。如果包位于存储库的根目录中,请使用以下语法
  dependencies:
    packageA:
      git:
        url: https://github.com/flutter/packageA.git
使用 SSH 的 Git 依赖
如果存储库是私有的,并且您可以使用 SSH 连接到它,请使用存储库的 SSH URL 依赖包
  dependencies:
    packageA:
      git:
        url: [email protected]:flutter/packageA.git
对文件夹中包的 Git 依赖
Pub 假设包位于 Git 存储库的根目录中。如果不是这种情况,请使用 path 参数指定位置。例如
dependencies:
  packageA:
    git:
      url: https://github.com/flutter/packages.git
      path: packages/packageA

最后,使用 ref 参数将依赖项固定到特定的 git 提交、分支或标签。有关更多详细信息,请参阅 包依赖项

示例

以下示例介绍了使用包的必要步骤。

示例:使用 css_colors 包

css_colors 包定义了 CSS 颜色常量,因此在 Flutter 框架需要 Color 类型时,请使用这些常量。

要使用此包

  1. 创建一个名为 cssdemo 的新项目。

  2. 打开 pubspec.yaml,并添加 css-colors 依赖项

    dependencies:
      flutter:
        sdk: flutter
      css_colors: ^1.0.0
    
  3. 在终端中运行 flutter pub get,或在 VS Code 中单击获取包

  4. 打开 lib/main.dart,并用以下内容替换其全部内容

    import 'package:css_colors/css_colors.dart';
     import 'package:flutter/material.dart';
    
     void main() {
       runApp(const MyApp());
     }
    
     class MyApp extends StatelessWidget {
       const MyApp({super.key});
    
       @override
       Widget build(BuildContext context) {
         return const MaterialApp(
           home: DemoPage(),
         );
       }
     }
    
     class DemoPage extends StatelessWidget {
       const DemoPage({super.key});
    
       @override
       Widget build(BuildContext context) {
         return Scaffold(body: Container(color: CSSColors.orange));
       }
     }
  1. 运行该应用。该应用的背景现在应该是橙色的。

示例:使用 url_launcher 包启动浏览器

url_launcher 插件包能够在移动平台上打开默认浏览器以显示给定的 URL,并且在 Android、iOS、Web、Windows、Linux 和 macOS 上受支持。此包是一个特殊的 Dart 包,称为插件包(或插件),其中包含特定于平台的代码。

要使用此插件

  1. 创建一个名为 launchdemo 的新项目。

  2. 打开 pubspec.yaml,并添加 url_launcher 依赖项

    dependencies:
      flutter:
        sdk: flutter
      url_launcher: ^5.4.0
    
  3. 在终端中运行 flutter pub get,或在 VS Code 中单击获取包

  4. 打开 lib/main.dart,并用以下内容替换其全部内容

    import 'package:flutter/material.dart';
     import 'package:path/path.dart' as p;
     import 'package:url_launcher/url_launcher.dart';
    
     void main() {
       runApp(const MyApp());
     }
    
     class MyApp extends StatelessWidget {
       const MyApp({super.key});
    
       @override
       Widget build(BuildContext context) {
         return const MaterialApp(
           home: DemoPage(),
         );
       }
     }
    
     class DemoPage extends StatelessWidget {
       const DemoPage({super.key});
    
       void launchURL() {
         launchUrl(p.toUri('https://fluttercn.cn'));
       }
    
       @override
       Widget build(BuildContext context) {
         return Scaffold(
           body: Center(
             child: ElevatedButton(
               onPressed: launchURL,
               child: const Text('Show Flutter homepage'),
             ),
           ),
         );
       }
     }
  5. 运行该应用(或停止并重新启动该应用,如果在添加插件之前该应用已在运行)。单击显示 Flutter 主页。您应该会看到设备上打开了默认浏览器,显示 flutter.dev 的主页。