在軟件開發中,很多時候有一些公共的庫或SDK可能會被很多項目用到,因此,將這些代碼單獨抽到一個獨立模塊,然后哪個項目需要使用時再直接集成這個模塊,便可大大提高開發效率。很多編程語言或開發工具都支持這種“模塊共享”機制,如Java語言中這種獨立模塊會被打成一個jar包,Android中的aar包,Web開發中的npm包等。為了方便表述,我們將這種可共享的獨立模塊統一稱為“包”( Package)。
一個APP在實際開發中往往會依賴很多包,而這些包通常都有交叉依賴關系、版本依賴等,如果由開發者手動來管理應用中的依賴包將會非常麻煩。因此,各種開發生態或編程語言官方通常都會提供一些包管理工具,比如在Android提供了Gradle來管理依賴,iOS用Cocoapods或Carthage來管理依賴,Node中通過npm等。而在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發布我們的包和插件。我們將在后面的章節中介紹如何向Pub發布我們的包和插件。
示例
接下來,我們實現一個顯示隨機字符串的widget。有一個名為“english_words”的開源軟件包,其中包含數千個常用的英文單詞以及一些實用功能。我們首先在pub上找到english_words這個包(如圖2-5所示),確定其最新的版本號和是否支持Flutter。
我們看到“english_words”包最新的版本是3.1.3,並且支持flutter,接下來:
-
將“english_words”(3.1.3版本)添加到依賴項列表,如下:
dependencies: flutter: sdk: flutter cupertino_icons: ^0.1.0 # 新添加的依賴 english_words: ^3.1.3
-
下載包。在Android Studio的編輯器視圖中查看pubspec.yaml時(圖2-6),單擊右上角的 Packages get 。
這會將依賴包安裝到您的項目。我們可以在控制台中看到以下內容:
flutter packages get Running "flutter packages get" in flutter_in_action... Process finished with exit code 0
我們也可以在控制台,定位到當前工程目錄,然后手動運行
flutter packages get
命令來下載依賴包。另外,需要注意dependencies
和dev_dependencies
的區別,前者的依賴包將作為APP的源碼的一部分參與編譯,生成最終的安裝包。而后者的依賴包只是作為開發階段的一些工具包,主要是用於幫助我們提高開發、測試效率,比如flutter的自動化測試包等。 -
引入
english_words
包。import 'package:english_words/english_words.dart';
在輸入時,Android Studio會自動提供有關庫導入的建議選項。導入后該行代碼將會顯示為灰色,表示導入的庫尚未使用。
-
使用
english_words
包來生成隨機字符串。class RandomWordsWidget extends StatelessWidget {
我們將
RandomWordsWidget
添加到_MyHomePageState.build
的Column
的子widget中。Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ ... //省略無關代碼 RandomWordsWidget(), ], )
-
如果應用程序正在運行,請使用熱重載按鈕(⚡️圖標) 更新正在運行的應用程序。每次單擊熱重載或保存項目時,都會在正在運行的應用程序中隨機選擇不同的單詞對。 這是因為單詞對是在
build
方法內部生成的。每次熱更新時,build
方法都會被執行,運行效果如圖2-7所示。
其它依賴方式
上文所述的依賴方式是依賴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開發中常用的,但還有一些其它依賴方式,完整的內容讀者可以自行查看:https://www.dartlang.org/tools/pub/dependencies 。