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