做自(zì)由與創造的先行者

Flutter 開(kāi)發 packages

Flutter開(kāi)發手冊

Package 介紹

使用(yòng)package可以創建可輕松共享的模塊化代碼。一個最小(xiǎo)的package包括

一個pubspec.yaml文(wén)件:聲明(míng)了(le)package的名稱、版本、作(zuò)者等的元數據文(wén)件。

一個 lib 文(wén)件夾:包括包中公開(kāi)的(public)代碼,最少應有一個.dart文(wén)件

Package 類型

Packages可以包含多種内容:

Dart包:其中一些(xiē)可能(néng)包含Flutter的特定功能(néng),因此對(duì)Flutter框架具有依賴性,僅将其用(yòng)于Flutter,例如fluro包。

插件包:一種專用(yòng)的Dart包,其中包含用(yòng)Dart代碼編寫的API,以及針對(duì)Android(使用(yòng)Java或Kotlin)和(hé)/或針對(duì)iOS(使用(yòng)ObjC或Swift)平台的特定實現(xiàn)。一個具體的例子是battery插件包。

Developing Dart packages

Step 1: 開(kāi)發Dart包

要創建Dart包,請(qǐng)使用(yòng)--template=package 來(lái)執行 flutter create

$ flutter create --template=package hello

這(zhè)将在hello/文(wén)件夾下(xià)創建一個具有以下(xià)專用(yòng)内容的package工(gōng)程:

lib/hello.dart:Package的Dart代碼

test/hello_test.dart:Package的單元測試代碼.

Step 2: 實現(xiàn)package

對(duì)于純Dart包,隻需在主lib/.dart文(wén)件内或lib目錄中的文(wén)件中添加功能(néng) 。

要測試軟件包,請(qǐng)在test目錄中添加unit tests。

有關如何組織包内容的更多詳細信息,請(qǐng)參閱Dart library package文(wén)檔。

開(kāi)發插件包

如果你(nǐ)想開(kāi)發一個調用(yòng)特定平台API的包,你(nǐ)需要開(kāi)發一個插件包,插件包是Dart包的專用(yòng)版本。 插件包包含針對(duì)Android(Java或Kotlin代碼)或iOS(Objective-C或Swift代碼)編寫的特定于平台的實現(xiàn)(可以同時(shí)包含Android和(hé)Ios原生的代碼)。 API使用(yòng)platform channels連接到(dào)特定平台(Android或IOS)。

Step 1: 創建 package

要創建插件包,請(qǐng)使用(yòng)--template=plugin參數執行flutter create

使用(yòng)--org選項指定您的組織,并使用(yòng)反向域名表示法。該值用(yòng)于生成的Android和(hé)iOS代碼中的各種包和(hé)包标識符。

$ flutter create --org com.example --template=plugin hello

這(zhè)将在hello/文(wén)件夾下(xià)創建一個具有以下(xià)專用(yòng)内容的插件工(gōng)程:

lib/hello.dart:插件包的Dart API.

android/src/main/java/com/yourcompany/​hello/HelloPlugin.java:插件包API的Android實現(xiàn).

ios/Classes/HelloPlugin.m:插件包API的ios實現(xiàn).

example/:一個依賴于該插件的Flutter應用(yòng)程序,來(lái)說明(míng)如何使用(yòng)它

默認情況下(xià),插件項目針對(duì)iOS代碼使用(yòng)Objective-C,Android代碼使用(yòng)Java。如果您更喜歡Swift或Kotlin,則可以使用(yòng)-i 或 -a 爲iOS或Android指定語言。例如:

$ flutter create --template=plugin -i swift -a kotlin hello

Step 2: 實現(xiàn)包 package

由于插件包中包含用(yòng)多種編程語言編寫的多個平台的代碼,因此需要一些(xiē)特定的步驟來(lái)确保順暢的體驗。

Step 2a: 定義包API(.dart)

插件包的API在Dart代碼中定義。打開(kāi)主文(wén)件夾hello/ 。找到(dào)lib/hello.dart

Step 2b: 添加Android平台代碼(.java / .kt)

我們建議(yì)您使用(yòng)Android Studio編輯Android代碼。

在Android Studio中編輯Android平台代碼之前,首先确保代碼至少已經構建過一次(例如,從(cóng)IntelliJ運行示例應用(yòng)程序或在終端執行cd hello/example; flutter build apk)

接下(xià)來(lái)

啓動Android Studio

在’Welcome to Android Studio’對(duì)話(huà)框選擇 ‘Import project’, 或者在菜單欄 ‘File > New > Import Project…‘,然後選擇hello/example/android/build.gradle文(wén)件.

在’Gradle Sync’ 對(duì)話(huà)框, 選擇 ‘OK’.

在’Android Gradle Plugin Update’ 對(duì)話(huà)框, 選擇 ‘Don’t remind me again for this project’.

您插件的Android平台代碼位于 hello/java/com.yourcompany.hello/​HelloPlugin.

您可以通過按下(xià) ▶ 按鈕從(cóng)Android Studio運行示例應用(yòng)程序.

Step 2c: 添加iOS平台代碼 (.h+.m/.swift)

我們建議(yì)您使用(yòng)Xcode編輯iOS代碼 。

在編輯Xcode中的iOS平台代碼之前,首先确保代碼至少已經構建過一次(例如,從(cóng)Xcode中運行示例應用(yòng)程序或終端執行cd hello/example; flutter build ios --no-codesign)。

接下(xià)來(lái)

啓動 Xcode

選擇 ‘File > Open’, 然後選擇 hello/example/ios/Runner.xcworkspace 文(wén)件.

您插件的iOS平台代碼位于Pods/DevelopmentPods/hello/Classes/中。

您可以通過按下(xià)▶按鈕來(lái)運行示例應用(yòng)程序

Step 2d: 連接API和(hé)平台代碼

最後,您需要将用(yòng)Dart代碼編寫的API與平台特定的實現(xiàn)連接起來(lái)。這(zhè)是通過platform channels完成的。

添加文(wén)檔

建議(yì)将以下(xià)文(wén)檔添加到(dào)所有軟件包:

README.md:介紹包的文(wén)件

CHANGELOG.md 記錄每個版本中的更改

LICENSE 包含軟件包許可條款的文(wén)件

所有公共API的API文(wén)檔 (詳情見下(xià)文(wén))

API documentation

在發布軟件包時(shí),API文(wén)檔會(huì)自(zì)動生成并發布到(dào)dartdocs.org,示例請(qǐng)參閱device_info docs

如果您希望在本地生成API文(wén)檔,請(qǐng)使用(yòng)以下(xià)命令:

将目錄更改爲您的軟件包的位置:cd ~/dev/mypackage

告訴文(wén)檔工(gōng)具Flutter SDK的位置:export FLUTTER_ROOT=~/dev/flutter (on macOS or Linux)set FLUTTER_ROOT=~/dev/flutter (on Windows)

運行 dartdoc 工(gōng)具 (它是Flutter SDK的一部分):$FLUTTER_ROOT/bin/cache/dart-sdk/bin/dartdoc (on macOS or Linux)%FLUTTER_ROOT%\bin\cache\dart-sdk\bin\dartdoc (on Windows)

有關如何編寫API文(wén)檔的提示,請(qǐng)參閱Effective Dart: Documentation

發布 packages

一旦你(nǐ)實現(xiàn)了(le)一個包,你(nǐ)可以在Pub上(shàng)發布它 ,這(zhè)樣其他(tā)開(kāi)發人員就可以輕松使用(yòng)它

在發布之前,檢查pubspec.yaml、README.md以及CHANGELOG.md文(wén)件,以确保其内容的完整性和(hé)正确性。

然後, 運行 dry-run 命令以查看(kàn)是否都準備OK了(le):

$ flutter packages pub publish --dry-run

最後, 運行發布命令:

$ flutter packages pub publish

有關發布的詳細信息,請(qǐng)參閱Pub publishing docs

處理(lǐ)包的相互依賴

如果您正在開(kāi)發一個hello包,它依賴于另一個包,則需要将該依賴包添加到(dào)pubspec.yaml文(wén)件的dependencies部分。 下(xià)面的代碼使url_launcher插件的Dart API ,這(zhè)在hello包中是可用(yòng)的:

In hello/pubspec.yaml:

dependencies:

url_launcher: ^0.4.2

現(xiàn)在你(nǐ)可以在hello中import 'package:url_launcher/url_launcher.dart' 然後 launch(someUrl) 了(le)。

這(zhè)與在Flutter應用(yòng)程序或任何其他(tā)Dart項目中引用(yòng)軟件包沒有什(shén)麽不同

但(dàn)是,如果hello碰巧是一個插件包,其平台特定的代碼需要訪問url_launcher公開(kāi)的特定于平台的API,那麽您還需要爲特定于平台的構建文(wén)件添加合适的依賴聲明(míng),如下(xià)所示。

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訪問UrlLauncherPlugin類

iOS

在hello/ios/hello.podspec:

Pod::Spec.new do |s|

# lines skipped

s.dependency 'url_launcher'

您現(xiàn)在可以在hello/ios/Classes源碼中 #import "UrlLauncherPlugin.h" 然後訪問 UrlLauncherPlugin 類

解決沖突

假設你(nǐ)想在你(nǐ)的hello包中使用(yòng)some_package和(hé)other_package,并且這(zhè)兩個包都依賴url_launcher,但(dàn)是依賴的是url_launcher的不同的版本。 那我們就有潛在的沖突。避免這(zhè)種情況的最好(hǎo)方法是在指定依賴關系時(shí),程序包作(zuò)者使用(yòng)版本範圍而不是特定版本。

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聲明(míng)了(le)上(shàng)面的依賴關系,other_package聲明(míng)了(le)url_launcher版本像’0.4.5’或’^0.4.0’,pub将能(néng)夠自(zì)動解決問題。 類似的注釋适用(yòng)于插件包對(duì)Gradle模塊和(hé)Cocoa pods的平台特定的依賴關系。

即使some_package和(hé)other_package聲明(míng)了(le)不兼容的url_launcher版本,它仍然可能(néng)會(huì)和(hé)url_launcher以兼容的方式正常工(gōng)作(zuò)。 你(nǐ)可以通過向hello包的pubspec.yaml文(wén)件中添加依賴性覆蓋聲明(míng)來(lái)處理(lǐ)沖突,從(cóng)而強制使用(yòng)特定版本:

強制使用(yòng) 0.4.3版本的url_launcher,在 hello/pubspec.yaml中:

dependencies:

some_package:

other_package:

dependency_overrides:

url_launcher: '0.4.3'

如果沖突的依賴不是一個包,而是一個特定于Android的庫,比如guava,那麽必須将依賴重寫聲明(míng)添加到(dào)Gradle構建邏輯中。

強制使用(yòng)23.0版本的guava庫,在hello/android/build.gradle中:

configurations.all {

resolutionStrategy {

force 'com.google.guava:guava:23.0-android'

}

}

Cocoapods目前不提供依賴覆蓋功能(néng)。

網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發
下(xià)一篇:Flutter 平台特定的代碼
上(shàng)一篇:Flutter 使用(yòng) packages