# 包管理
一個完整的應用程序往往會依賴很多第三方包,正如在原生開發中,Android使用Gradle來管理依賴,iOS用Cocoapods或Carthage來管理依賴,而Flutter也有自己的依賴管理工具,本節我們主要介紹一下flutter如何使用配置文件`pubspec.yaml`(位于項目根目錄)來管理第三方依賴包。
YAML是一種直觀、可讀性高并且容易被人類閱讀的文件格式,它和xml或Json相比,它語法簡單并非常容易解析,所以YAML常用于配置文件,Flutter也是用yaml文件作為其配置文件,Flutter項目默認的配置文件是`pubspec.yaml`,我們看一個簡單的示例:
```
name: flutter_in_action
description: First Flutter application.
version: 1.0.0+1
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
dev_dependencies:
flutter_test:
sdk: flutter
flutter:
uses-material-design: true
```
下面,我們逐一解釋一下各個字段的意義:
- name:應用或包名稱。
- description: 應用或包的描述、簡介。
- version:應用或包的版本號。
- dependencies:應用或包依賴的其它包或插件。
- dev\_dependencies:開發環境依賴的工具包(而不是flutter應用本身依賴的包)。
- flutter:flutter相關的配置選項。
如果我們的Flutter應用本身依賴某個包,我們需要將所依賴的包添加到`dependencies` 下,接下來我們通過一個例子來演示一下如何依賴、下載并使用第三方包。
## Pub倉庫
Pub(<https://pub.dartlang.org/> )是Google官方的Dart Packages倉庫,類似于node中的npm倉庫,android中的jcenter,我們可以在上面查找我們需要的包和插件,也可以向pub發布我們的包和插件。我們將在后面的章節中介紹如何向pub發布我們的包和插件。
## 示例
接下來,我們實現一個顯示隨機字符串的widget。有一個名為“english\_words”的開源軟件包,其中包含數千個常用的英文單詞以及一些實用功能。我們首先在pub上找到english\_words這個包,確定其最新的版本號和是否支持Flutter。

我們看到“english\_words”包最新的版本是3.1.3,并且支持flutter,接下來:
1. 將english\_words(3.1.3版本)添加到依賴項列表,如下:
```
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.0
# 新添加的依賴
english_words: ^3.1.3
```
2. 下載包
在Android Studio的編輯器視圖中查看pubspec.yaml時,單擊右上角的 **Packages get** 。

這會將依賴包安裝到您的項目。您可以在控制臺中看到以下內容:
```
flutter packages get
Running "flutter packages get" in flutter_in_action...
Process finished with exit code 0
```
你也可以在控制臺,定位到當前工程目錄,然后手動運行`flutter packages get` 命令來下載依賴包。
1. 引入`english_words`包。
```
import 'package:english_words/english_words.dart';
```
在輸入時,Android Studio會自動提供有關庫導入的建議選項。導入后該行代碼將會顯示為灰色,表示導入的庫尚未使用。
2. 使用`english_words`包來生成隨機字符串。
```
class RandomWordsWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
// 生成隨機字符串
final wordPair = new WordPair.random();
return Padding(
padding: const EdgeInsets.all(8.0),
child: new Text(wordPair.toString()),
);
}
}
```
我們將`RandomWordsWidget` 添加到"計數器"示例的首頁`MyHomePage` 的`Column`的子widget中。
3. 如果應用程序正在運行,請使用熱重載按鈕 () 更新正在運行的應用程序。每次單擊熱重載或保存項目時,都會在正在運行的應用程序中隨機選擇不同的單詞對。 這是因為單詞對是在 `build` 方法內部生成的。每次熱更新時,`build`方法都會被執行。

## 其它依賴方式
上文所述的依賴方式是依賴pub倉庫的。但我們還可以依賴本地包和git倉庫。
- 依賴本地包
如果我們正在本地開發一個包,包名為pkg1,我們可以通過下面方式依賴:
```
dependencies:
pkg1:
path: ../../code/pkg1
```
路徑可以是相對的,也可以是絕對的。
- 依賴Git:你也可以依賴存儲在Git倉庫中的包。如果軟件包位于倉庫的根目錄中,請使用以下語法
```
dependencies:
pkg1:
git:
url: git://github.com/xxx/pkg1.git
```
上面假定包位于Git存儲庫的根目錄中。如果不是這種情況,可以使用path參數指定相對位置,例如:
```
dependencies:
package1:
git:
url: git://github.com/flutter/packages.git
path: packages/package1
```
## 總結
本節介紹了引用、下載、使用一個包的整體流程,并在后面介紹了多種不同的引入方式,這些是Flutter開發中常用的,但Dart的dependencies還有一些其它依賴方式,完整的內容讀者可以自行查看:<https://www.dartlang.org/tools/pub/dependencies> 。
- 緣起
- 起步
- 移動開發技術簡介
- Flutter簡介
- 搭建Flutter開發環境
- 常見配置問題
- Dart語言簡介
- 第一個Flutter應用
- 計數器示例
- 路由管理
- 包管理
- 資源管理
- 調試Flutter APP
- Dart線程模型及異常捕獲
- 基礎Widgets
- Widget簡介
- 文本、字體樣式
- 按鈕
- 圖片和Icon
- 單選框和復選框
- 輸入框和表單
- 布局類Widgets
- 布局類Widgets簡介
- 線性布局Row、Column
- 彈性布局Flex
- 流式布局Wrap、Flow
- 層疊布局Stack、Positioned
- 容器類Widgets
- Padding
- 布局限制類容器ConstrainedBox、SizeBox
- 裝飾容器DecoratedBox
- 變換Transform
- Container容器
- Scaffold、TabBar、底部導航
- 可滾動Widgets
- 可滾動Widgets簡介
- SingleChildScrollView
- ListView
- GridView
- CustomScrollView
- 滾動監聽及控制ScrollController
- 功能型Widgets
- 導航返回攔截-WillPopScope
- 數據共享-InheritedWidget
- 主題-Theme
- 事件處理與通知
- 原始指針事件處理
- 手勢識別
- 全局事件總線
- 通知Notification
- 動畫
- Flutter動畫簡介
- 動畫結構
- 自定義路由過渡動畫
- Hero動畫
- 交錯動畫
- 自定義Widget
- 自定義Widget方法簡介
- 通過組合現有Widget實現
- 實例:TurnBox
- CustomPaint與Canvas
- 實例:圓形漸變進度條(自繪)
- 文件操作與網絡請求
- 文件操作
- Http請求-HttpClient
- Http請求-Dio package
- 實例:Http分塊下載
- WebSocket
- 使用Socket API
- Json轉Model
- 包與插件
- 開發package
- 插件開發:平臺通道簡介
- 插件開發:實現Android端API
- 插件開發:實現IOS端API
- 系統能力調用
- 國際化
- 讓App支持多語言
- 實現Localizations
- 使用Intl包
- Flutter核心原理
- Flutter UI系統
- Element和BuildContext
- RenderObject與RenderBox
- Flutter從啟動到顯示