新聞中心
Package 介紹
使用package可以創(chuàng)建可輕松共享的模塊化代碼。一個(gè)最小的package包括

成都創(chuàng)新互聯(lián)從2013年開(kāi)始,先為旌德等服務(wù)建站,旌德等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為旌德企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
- 一個(gè)pubspec.yaml文件:聲明了package的名稱(chēng)、版本、作者等的元數(shù)據(jù)文件。
- 一個(gè) lib 文件夾:包括包中公開(kāi)的(public)代碼,最少應(yīng)有一個(gè)
.dart文件
Package 類(lèi)型
Packages可以包含多種內(nèi)容:
- Dart包:其中一些可能包含F(xiàn)lutter的特定功能,因此對(duì)Flutter框架具有依賴(lài)性,僅將其用于Flutter,例如fluro包。
- 插件包:一種專(zhuān)用的Dart包,其中包含用Dart代碼編寫(xiě)的API,以及針對(duì)Android(使用Java或Kotlin)和/或針對(duì)iOS(使用ObjC或Swift)平臺(tái)的特定實(shí)現(xiàn)。一個(gè)具體的例子是battery插件包。
Developing Dart packages
Step 1: 開(kāi)發(fā)Dart包
要?jiǎng)?chuàng)建Dart包,請(qǐng)使用--template=package 來(lái)執(zhí)行 flutter create
$ flutter create --template=package hello這將在hello/文件夾下創(chuàng)建一個(gè)具有以下專(zhuān)用內(nèi)容的package工程:
- lib/hello.dart:Package的Dart代碼
- test/hello_test.dart:Package的單元測(cè)試代碼.
Step 2: 實(shí)現(xiàn)package
對(duì)于純Dart包,只需在主lib/
要測(cè)試軟件包,請(qǐng)?jiān)趖est目錄中添加unit tests。
有關(guān)如何組織包內(nèi)容的更多詳細(xì)信息,請(qǐng)參閱Dart library package文檔。
開(kāi)發(fā)插件包
如果你想開(kāi)發(fā)一個(gè)調(diào)用特定平臺(tái)API的包,你需要開(kāi)發(fā)一個(gè)插件包,插件包是Dart包的專(zhuān)用版本。 插件包包含針對(duì)Android(Java或Kotlin代碼)或iOS(Objective-C或Swift代碼)編寫(xiě)的特定于平臺(tái)的實(shí)現(xiàn)(可以同時(shí)包含Android和Ios原生的代碼)。 API使用platform channels連接到特定平臺(tái)(Android或IOS)。
Step 1: 創(chuàng)建 package
要?jiǎng)?chuàng)建插件包,請(qǐng)使用--template=plugin參數(shù)執(zhí)行flutter create
使用--org選項(xiàng)指定您的組織,并使用反向域名表示法。該值用于生成的Android和iOS代碼中的各種包和包標(biāo)識(shí)符。
$ flutter create --org com.example --template=plugin hello這將在hello/文件夾下創(chuàng)建一個(gè)具有以下專(zhuān)用內(nèi)容的插件工程:
- lib/hello.dart:插件包的Dart API.
- android/src/main/java/com/yourcompany/?hello/HelloPlugin.java:插件包API的Android實(shí)現(xiàn).
- ios/Classes/HelloPlugin.m:插件包API的ios實(shí)現(xiàn).
- example/:一個(gè)依賴(lài)于該插件的Flutter應(yīng)用程序,來(lái)說(shuō)明如何使用它
默認(rèn)情況下,插件項(xiàng)目針對(duì)iOS代碼使用Objective-C,Android代碼使用Java。如果您更喜歡Swift或Kotlin,則可以使用-i 或 -a 為iOS或Android指定語(yǔ)言。例如:
$ flutter create --template=plugin -i swift -a kotlin hello
Step 2: 實(shí)現(xiàn)包 package
由于插件包中包含用多種編程語(yǔ)言編寫(xiě)的多個(gè)平臺(tái)的代碼,因此需要一些特定的步驟來(lái)確保順暢的體驗(yàn)。
Step 2a: 定義包API(.dart)
插件包的API在Dart代碼中定義。打開(kāi)主文件夾hello/ 。找到lib/hello.dart
Step 2b: 添加Android平臺(tái)代碼(.java / .kt)
我們建議您使用Android Studio編輯Android代碼。
在Android Studio中編輯Android平臺(tái)代碼之前,首先確保代碼至少已經(jīng)構(gòu)建過(guò)一次(例如,從IntelliJ運(yùn)行示例應(yīng)用程序或在終端執(zhí)行cd hello/example; flutter build apk)
接下來(lái)
- 啟動(dòng)Android Studio
- 在’Welcome to Android Studio’對(duì)話(huà)框選擇 ‘Import project’, 或者在菜單欄 ‘File > New > Import Project…‘,然后選擇hello/example/android/build.gradle文件.
- 在’Gradle Sync’ 對(duì)話(huà)框, 選擇 ‘OK’.
- 在’Android Gradle Plugin Update’ 對(duì)話(huà)框, 選擇 ‘Don’t remind me again for this project’.
您插件的Android平臺(tái)代碼位于 hello/java/com.yourcompany.hello/?HelloPlugin.
您可以通過(guò)按下 ? 按鈕從Android Studio運(yùn)行示例應(yīng)用程序.
Step 2c: 添加iOS平臺(tái)代碼 (.h+.m/.swift)
我們建議您使用Xcode編輯iOS代碼 。
在編輯Xcode中的iOS平臺(tái)代碼之前,首先確保代碼至少已經(jīng)構(gòu)建過(guò)一次(例如,從Xcode中運(yùn)行示例應(yīng)用程序或終端執(zhí)行cd hello/example; flutter build ios --no-codesign)。
接下來(lái)
- 啟動(dòng) Xcode
- 選擇 ‘File > Open’, 然后選擇 hello/example/ios/Runner.xcworkspace 文件.
您插件的iOS平臺(tái)代碼位于Pods/DevelopmentPods/hello/Classes/中。
您可以通過(guò)按下?按鈕來(lái)運(yùn)行示例應(yīng)用程序
Step 2d: 連接API和平臺(tái)代碼
最后,您需要將用Dart代碼編寫(xiě)的API與平臺(tái)特定的實(shí)現(xiàn)連接起來(lái)。這是通過(guò)platform channels完成的。
添加文檔
建議將以下文檔添加到所有軟件包:
- README.md:介紹包的文件
- CHANGELOG.md 記錄每個(gè)版本中的更改
- LICENSE 包含軟件包許可條款的文件
- 所有公共API的API文檔 (詳情見(jiàn)下文)
API documentation
在發(fā)布軟件包時(shí),API文檔會(huì)自動(dòng)生成并發(fā)布到dartdocs.org,示例請(qǐng)參閱device_info docs
如果您希望在本地生成API文檔,請(qǐng)使用以下命令:
- 將目錄更改為您的軟件包的位置:cd ~/dev/mypackage
- 告訴文檔工具Flutter SDK的位置:export FLUTTER_ROOT=~/dev/flutter (on macOS or Linux)set FLUTTER_ROOT=~/dev/flutter (on Windows)
- 運(yùn)行 dartdoc 工具 (它是Flutter SDK的一部分):$FLUTTER_ROOT/bin/cache/dart-sdk/bin/dartdoc (on macOS or Linux)%FLUTTER_ROOT%\bin\cache\dart-sdk\bin\dartdoc (on Windows)
有關(guān)如何編寫(xiě)API文檔的提示,請(qǐng)參閱Effective Dart: Documentation
發(fā)布 packages
一旦你實(shí)現(xiàn)了一個(gè)包,你可以在Pub上發(fā)布它 ,這樣其他開(kāi)發(fā)人員就可以輕松使用它
在發(fā)布之前,檢查pubspec.yaml、README.md以及CHANGELOG.md文件,以確保其內(nèi)容的完整性和正確性。
然后, 運(yùn)行 dry-run 命令以查看是否都準(zhǔn)備OK了:
$ flutter packages pub publish --dry-run最后, 運(yùn)行發(fā)布命令:
$ flutter packages pub publish有關(guān)發(fā)布的詳細(xì)信息,請(qǐng)參閱Pub publishing docs
處理包的相互依賴(lài)
如果您正在開(kāi)發(fā)一個(gè)hello包,它依賴(lài)于另一個(gè)包,則需要將該依賴(lài)包添加到pubspec.yaml文件的dependencies部分。 下面的代碼使url_launcher插件的Dart API ,這在hello包中是可用的:
In hello/pubspec.yaml:
dependencies:
url_launcher: ^0.4.2
現(xiàn)在你可以在hello中import 'package:url_launcher/url_launcher.dart' 然后 launch(someUrl) 了。
這與在Flutter應(yīng)用程序或任何其他Dart項(xiàng)目中引用軟件包沒(méi)有什么不同
但是,如果hello碰巧是一個(gè)插件包,其平臺(tái)特定的代碼需要訪問(wèn)url_launcher公開(kāi)的特定于平臺(tái)的API,那么您還需要為特定于平臺(tái)的構(gòu)建文件添加合適的依賴(lài)聲明,如下所示。
Android
在 hello/android/build.gradle:
android {
// lines skipped
dependencies {
provided rootProject.findProject(":url_launcher")
}
}
您現(xiàn)在可以在hello/android/src源碼中import io.flutter.plugins.urllauncher.UrlLauncherPlugin訪問(wèn)UrlLauncherPlugin類(lèi)
iOS
在hello/ios/hello.podspec:
Pod::Spec.new do |s|
# lines skipped
s.dependency 'url_launcher'
您現(xiàn)在可以在hello/ios/Classes源碼中 #import "UrlLauncherPlugin.h" 然后訪問(wèn) UrlLauncherPlugin 類(lèi)
解決沖突
假設(shè)你想在你的hello包中使用some_package和other_package,并且這兩個(gè)包都依賴(lài)url_launcher,但是依賴(lài)的是url_launcher的不同的版本。 那我們就有潛在的沖突。避免這種情況的最好方法是在指定依賴(lài)關(guān)系時(shí),程序包作者使用版本范圍而不是特定版本。
dependencies:
url_launcher: ^0.4.2 # Good, any 0.4.x with x >= 2 will do.
image_picker: '0.1.1' # Not so good, only 0.1.1 will do.
如果some_package聲明了上面的依賴(lài)關(guān)系,other_package聲明了url_launcher版本像’0.4.5’或’^0.4.0’,pub將能夠自動(dòng)解決問(wèn)題。 類(lèi)似的注釋適用于插件包對(duì)Gradle模塊和Cocoa pods的平臺(tái)特定的依賴(lài)關(guān)系。
即使some_package和other_package聲明了不兼容的url_launcher版本,它仍然可能會(huì)和url_launcher以兼容的方式正常工作。 你可以通過(guò)向hello包的pubspec.yaml文件中添加依賴(lài)性覆蓋聲明來(lái)處理沖突,從而強(qiáng)制使用特定版本:
強(qiáng)制使用 0.4.3版本的url_launcher,在 hello/pubspec.yaml中:
dependencies:
some_package:
other_package:
dependency_overrides:
url_launcher: '0.4.3'
如果沖突的依賴(lài)不是一個(gè)包,而是一個(gè)特定于Android的庫(kù),比如guava,那么必須將依賴(lài)重寫(xiě)聲明添加到Gradle構(gòu)建邏輯中。
強(qiáng)制使用23.0版本的guava庫(kù),在hello/android/build.gradle中:
configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:23.0-android'
}
}
Cocoapods目前不提供依賴(lài)覆蓋功能。
當(dāng)前標(biāo)題:創(chuàng)新互聯(lián)Flutter教程:Flutter開(kāi)發(fā)packages
文章源于:http://m.fisionsoft.com.cn/article/cdcphpp.html


咨詢(xún)
建站咨詢(xún)
