使用包
如何在 Flutter 应用中使用包。
Flutter 支持使用由其他开发者为 Flutter 和 Dart 生态系统贡献的共享包。这使得开发者能够快速构建应用,而无需从头开发所有内容。
现有的包支持许多用例——例如,进行网络请求(http)、导航/路由处理(go_router)、与设备 API 集成(url_launcher 和 battery_plus),以及使用第三方平台 SDK(如 Firebase,即 FlutterFire)。
要编写一个新包,请参阅开发包。要添加资产、图像或字体(无论存储在文件还是包中),请参阅添加资产和图像。
使用包
#以下部分介绍了如何使用现有的已发布包。
搜索包
#包被发布到 pub.dev。
pub.dev 上的 Flutter 着陆页展示了与 Flutter 兼容的热门包(即声明了与 Flutter 通用兼容的依赖项的包),并支持在所有已发布的包中进行搜索。
pub.dev 上的 Flutter 推荐包 (Flutter Favorites) 页面列出了被认定为你在编写应用时应优先考虑使用的插件和包。有关成为 Flutter 推荐包意味着什么的更多信息,请参阅 Flutter 推荐包计划。
你还可以通过过滤 Android、iOS、Web、Linux、Windows、macOS 或它们的任何组合,来浏览 pub.dev 上的包。
使用 flutter pub add 为应用添加包依赖
#
要将 english_words 包添加到应用中
-
在项目目录内使用
pub add命令flutter pub add english_words
-
导入它
- 在 Dart 代码中添加相应的
import语句。
- 在 Dart 代码中添加相应的
-
如有必要,停止并重启应用
- 如果包引入了特定于平台的代码(Android 使用 Kotlin/Java,iOS 使用 Swift/Objective-C),则必须将该代码构建到你的应用中。热重载和热重启仅更新 Dart 代码,因此可能需要完全重启应用,以避免在使用该包时出现
MissingPluginException等错误。
- 如果包引入了特定于平台的代码(Android 使用 Kotlin/Java,iOS 使用 Swift/Objective-C),则必须将该代码构建到你的应用中。热重载和热重启仅更新 Dart 代码,因此可能需要完全重启应用,以避免在使用该包时出现
为应用添加包依赖
#要将 english_words 包添加到应用中
-
依赖它
- 打开应用文件夹内的
pubspec.yaml文件,在dependencies下添加english_words: ^4.0.0。
- 打开应用文件夹内的
-
安装它
- 从终端运行:
flutter pub get。
或者 - 在 VS Code 中:点击
pubspec.yaml顶部操作功能区右侧的“下载”图标(Get Packages)。 - 在 Android Studio/IntelliJ 中:点击
pubspec.yaml顶部操作功能区中的 Pub get。
- 从终端运行:
-
导入它
- 在 Dart 代码中添加相应的
import语句。
- 在 Dart 代码中添加相应的
-
如有必要,停止并重启应用
- 如果包引入了特定于平台的代码(Android 使用 Kotlin/Java,iOS 使用 Swift/Objective-C),则必须将该代码构建到你的应用中。热重载和热重启仅更新 Dart 代码,因此可能需要完全重启应用,以避免在使用该包时出现
MissingPluginException等错误。
- 如果包引入了特定于平台的代码(Android 使用 Kotlin/Java,iOS 使用 Swift/Objective-C),则必须将该代码构建到你的应用中。热重载和热重启仅更新 Dart 代码,因此可能需要完全重启应用,以避免在使用该包时出现
使用 flutter pub remove 从应用中移除包依赖
#
要从应用中移除 english_words 包
- 在项目目录内使用
pub remove命令flutter pub remove english_words
pub.dev 上每个包页面提供的安装 (Installing) 选项卡是这些步骤的便捷参考。
有关完整示例,请参阅下方的 english_words 示例。
解决冲突
#假设你希望在应用中使用 some_package 和 another_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_package 和 another_package 为 url_launcher 声明了不兼容的版本,它们实际上也可能以兼容的方式使用 url_launcher。在这种情况下,可以通过在应用的 pubspec.yaml 文件中添加依赖项覆盖(dependency override)声明来解决冲突,强制使用特定版本。
例如,要强制使用 url_launcher 版本 5.4.0,请对应用的 pubspec.yaml 文件进行以下更改
dependencies:
some_package:
another_package:
dependency_overrides:
url_launcher: '5.4.0'
如果冲突的依赖项本身不是包,而是像 guava 这样的 Android 特定库,则必须改为在 Gradle 构建逻辑中添加依赖项覆盖声明。
要强制使用 guava 版本 28.0,请对应用的 android/build.gradle 文件进行以下更改
configurations.all {
resolutionStrategy {
force("com.google.guava:guava:28.0-android")
}
}
configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:28.0-android'
}
}
CocoaPods 目前不提供依赖项覆盖功能。
开发新包
#如果针对你的特定用例不存在现成的包,你可以编写一个自定义包。
管理包依赖和版本
#为了降低版本冲突的风险,请在 pubspec.yaml 文件中指定版本范围。
包版本
#所有包都有一个版本号,在包的 pubspec.yaml 文件中指定。包的当前版本显示在其名称旁边(例如,参见 url_launcher 包),此外还有所有先前版本的列表(参见 url_launcher 版本)。
为确保在更新包时应用不会崩溃,请使用以下格式之一指定版本范围。
-
范围约束:指定最小和最大版本。
yamldependencies: url_launcher: '>=5.4.0 <6.0.0' -
使用 插入符号 (caret) 语法的范围约束:指定作为包含性最小版本的版本。这涵盖了从该版本到下一个主版本的所有版本。
yamldependencies: collection: '^5.4.0'此语法与第一个要点中提到的语法含义相同。
要了解更多信息,请查阅 包版本控制指南。
更新包依赖
#首次添加包后运行 flutter pub get 时,Flutter 会保存 pubspec.lock 锁文件中找到的具体包版本。这确保了如果你或团队中的其他开发者运行 flutter pub get,都能获得相同的版本。
要升级到包的新版本(例如使用该包中的新功能),请运行 flutter pub upgrade 以检索 pubspec.yaml 中指定版本约束所允许的最高可用包版本。请注意,这与 flutter upgrade 或 flutter update-packages 不同,后者是用于更新 Flutter 本身的。
未发布包的依赖项
#即使包未发布在 pub.dev 上,也可以使用它们。对于私有包,或尚未准备好发布的包,可以使用其他依赖项选项
- 路径依赖
-
Flutter 应用可以使用文件系统
path:依赖项来依赖某个包。路径可以是相对路径或绝对路径。相对路径是相对于包含pubspec.yaml的目录进行评估的。例如,要依赖于位于应用所在目录旁边的目录中的 packageA,请使用以下语法yamldependencies: packageA: path: ../packageA/ - Git 依赖
-
你还可以依赖存储在 Git 仓库中的包。如果包位于仓库的根目录,请使用以下语法
yamldependencies: packageA: git: url: https://github.com/flutter/packageA.git - 使用 SSH 的 Git 依赖
-
如果仓库是私有的且可以通过 SSH 连接,请使用该仓库的 SSH URL 来依赖该包
yamldependencies: packageA: git: url: git@github.com:flutter/packageA.git - 对文件夹中包的 Git 依赖
-
Pub 默认包位于 Git 仓库的根目录。如果并非如此,请使用
path参数指定位置。例如yamldependencies: packageA: git: url: https://github.com/flutter/packages.git path: packages/packageA最后,使用
ref参数将依赖项固定到特定的 Git 提交、分支或标签。有关更多详细信息,请参阅 包依赖项。
示例
#以下示例展示了使用包的必要步骤。
示例:使用 english_words 包
#english_words 包包含数千个最常用的英语单词以及一些实用函数。
要使用此包
创建一个名为
words_demo的新项目。运行
dart pub add english_words以添加依赖。-
打开
lib/main.dart并将其全部内容替换为dartimport 'package:english_words/english_words.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: Center(child: Text(generateWordPairs().first.asPascalCase)), ); } } 运行应用。应用文本应显示一个随机的英语单词对。
示例:使用 url_launcher 包启动浏览器
#url_launcher 插件包支持在移动平台上打开默认浏览器以显示给定 URL,并支持 Android、iOS、Web、Windows、Linux 和 macOS。此包是一种称为插件包(或插件)的特殊 Dart 包,它包含特定于平台的代码。
要使用此插件
创建一个名为
launchdemo的新项目。-
打开
pubspec.yaml并添加url_launcher依赖yamldependencies: flutter: sdk: flutter url_launcher: ^5.4.0 -
在终端运行
flutter pub get,或在 VS Code 中点击 Get Packages。 -
打开
lib/main.dart并将以下内容替换为全部内容dartimport 'package:flutter/material.dart'; 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(Uri.parse('https://fluttercn.cn')); } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: ElevatedButton( onPressed: launchURL, child: const Text('Show Flutter homepage'), ), ), ); } } -
运行应用(如果添加插件前已在运行,则需停止并重启)。点击 Show Flutter homepage。你应该会看到设备上的默认浏览器打开并显示 flutter.dev 的主页。