前言: 批改移動端在這次重構的時候,技術選型上咱們團隊選擇了Flutter來進行本次移動端的重構,由於使用Flutter能夠在UI的開發效率上充分節省人效,能夠把更多的時間放在其餘方面的研究上。可是在實際開發中,有部分的功能Flutter是不支持的,還須要native端來進行支持,而如何使native端支持的功能能夠方便的、高效的服務於咱們本身的同時又能夠對外提供便利,在其餘項目或者是其餘團隊在須要使用一樣功能的時候能夠不須要重複的造輪子,如Java的jar包,Android的aar包,Web的npm包, iOS的pod包等,而在Flutter中,Flutter也是支持使用由其餘開發者貢獻給Flutter和Dart生態系統的共享軟件包,使咱們能夠快速構建應用程序,而無需從頭開始開發全部應用程序,這就是咱們今天要介紹的Package。java
因此針對package的瞭解上就不能僅僅止步於會使用的層次,更須要了解如何開發一個屬於本身的package以及如何將本身的package成功發佈到pub倉庫或者是私有倉庫供他人使用。linux
##01 package介紹 什麼是Packageandroid
使用Package能夠建立能輕鬆共享的模塊化代碼,而一個最小的Package包括: 一個pubspec.yaml文件:聲明瞭package的名稱、版本、做者等的元數據文件。 一個 lib 文件夾:包括包中公開的(public)代碼,最少應有一個<package-name>.dart文件。 Package類型:ios
Flutter Package(dart包):Flutter純Dart插件工程,僅包含Dart層的實現,每每定義一些公共Widget Flutter Plugin(插件包):一種專用的Dart包,其中包含用Dart代碼編寫的API,以及針對Android(使用Java或Kotlin)和針對iOS(使用OC或Swift)平臺的特定實現 Plugin其實就是一個特殊的Package。Flutter Plugin提供Android或者iOS的底層封裝,在Flutter層提供組件功能,使Flutter能夠較方便的調取Native的模塊。不少平臺相關性或者對於Flutter實現起來比較複雜的部分,均可以封裝成Plugin 。Flutter與native之間的通訊原理此篇文章咱們不深刻討論,通訊原理能夠參考下圖: git
02 package 開發
咱們瞭解到了Package是什麼以後,那如何開發咱們本身的package包呢? 建立一個包或者是插件通常有兩種方式:github
- 可視化方式
- 命令行方式 可視化方式
- 打開Android Studio -> 選擇Create New Flutter Project;
- 若是想要建立插件包 則選擇Flutter Plugin;
- 若是想要建立Dart包 則選擇Flutter Package;
- 根據須要修改相關內容,而後點擊Next;
- 根據須要修改package name以及選擇package開發中須要的語言 (選擇pulgin包纔會有此步驟)
- 建立成功 命令行方式
- 建立Dart包 flutter create --template=package dartPackageNam
- 建立plugin包 flutter create --org com.example --template=plugin --platforms=android,ios -a kotlin -i swift pluginPackageName 參數: --org:指定您的組織,使用反向域名錶示法 --template: 指定是純Dart包仍是Plugin包 --platforms: 表明指定插件支持的平臺 可用的平臺有:android、ios、web、linux、macos 和windows -a 指定Android平臺所使用的語言 java、kotlin -i 指定iOS平臺所支持的語言 objc、swift
**Package包建立成功以後,查看工程下的文件: ** 純Dart包 包含的文件:web
- LICENSE 文件 # 許可證文件。
- test/flutter_package_first_test.dart文件 ## Package 的 單元測試 文件。
- .gitignore 文件 ## 告訴 git 系統應該隱藏哪些文件或文件夾的一個隱藏文件。
- pubspec.yaml 文件 ## pub 工具須要使用的,包含 package 依賴的 yaml 格式的文件。
- README.md 文件 ## 起步文檔,用於描述 package。
- lib/flutter_package_first.dart 文件 ## package 的 Dart 實現代碼
- CHANGELOG.md 文件 ## 用於記錄 package 的版本變動
Plugin包 包含的文件:
- lib/flutter_plugin.dart 文件 ## Dart 插件 API 實現。
- android/src/main/java/com/example/flutter_plugin/FlutterPlugin 文件 ## Android 平臺原生插件 API 實現(使用 Kotlin 編程語言)。
- ios/Classes/FlutterPlugin.m 文件 ## iOS 平臺原生插件 API 實現(使用 Objective-C 編程語言)。
- example/ 文件 ## 一個依賴於該插件並說明了如何使用它的 Flutter 應用。
若是要編輯iOS目錄下相關文件或者是Android目錄下的相關文件 須要去特定的編輯器中打開各端的文件進行編輯
- iOS端:
- Android端:
03 package 發佈
咱們已經瞭解了package包是什麼,以及如何製做不一樣的package包,那如何發佈Package包呢?(集團pub倉庫發佈文檔) ** package發佈位置能夠選擇:**chrome
- pub.dev
- 私有pub倉庫(集團pub倉庫)
- git倉庫 在發佈package以前,要先檢查這幾個文件:pubspec.yaml、README.md、CHANGELOG.md 確保這幾個文件完整。
- pubspec.yaml配置文件的配置:
- name: xxxx ## pub庫名稱
- version: 0.0.1 ## 當前插件版本 確保每次發佈與以前的版本不一致
- description: xxxxxxxxx ## pub庫簡介
- homepage:https://github.com/xxxx ## pub庫git地址
- publish_to:http://pub.100tal.com/ ## 私有pub庫上傳地址 若是不是私有pub倉庫 不用配置
- author:xxxxxx@100tal.com ## pub庫做者
- 檢測配置文件: flutter packages pub publish --dry-run
- 發佈 flutter packages pub publish
04 package 使用
package包發佈成功以後,咱們該如何在項目中使用呢? 首先是在pubSpec.yaml中添加依賴macos
- 依賴pub.dev倉庫的package包 #實例1 在該項目中,此插件指定版本爲1.4.0 flutter_plugin: ^1.4.0 #實例2 在該項目中,此插件最低版本爲1.2.3 flutter_plugin: ">=1.2.3" #實例3 在該項目中,此插件最低支持2.0.0版本,但不支持3.0.0以上版本 flutter_plugin: ">=2.0.0 <3.0.0" #實例4 在該項目中,此插件最高支持到1.2.3如下版本
flutter_plugin: "<1.2.3" - 依賴git倉庫的package包
- flutter_plugin:
- git: url: https://github.com/xxxxxx/xxxxxx.git #git倉庫地址
- path: xxxxx #若是項目不是在git地址的根目錄 則須要指定path
- ref: ‘1.0.0' #指定的版本 對應git倉庫中的tag標籤 也能夠指定分支 ref: some-branch
- 依賴私有pub倉庫的package包 xes_recorder: hosted: name: xes_recorder url: http://pub.100tal.com version: 0.0.1
- 依賴本地package flutter_pub: path: ../ #能夠是相對路徑 也能夠是絕對路徑
05 發佈過程當中可能會遇到的問題記錄
1)author 在最新版本進行‘flutter packages pub publish --dry-run’檢測的時候 會報警告 須要移除掉才能檢測經過。 2)執行發佈命令的時候 會遇到須要登陸如下地址去受權的狀況 須要登陸google帳號 請使用chrome打開去驗證。 npm
- 驗證經過-開始上傳-上傳成功去 pub.dev 或者本身的私有pub倉庫 查看是否發佈成功 。
- 驗證成功-開始上傳-若是超時未成功則須要繞過google受權從新上傳。 3)跳過google驗證方法;
- 下載pub項目[下載地址:https://github.com/ameryzhu/pub]
- 使用Android Studio打開下載的項目 並在Terminal順序執行: pub get; dart--snapshot=mypub.dart.snapshot bin/pu b.dart #執行完這個命令會在pub項目根目錄下生成一個mypub.dart.snapshot文件 ;
4)把這個文件放到 ${flutterSDK Path}/bin/cache /dart-sdk/bin/snapshots/ 目錄下; 5)而後用編輯器打開${flutterSDKPath}/bin/cache /da rt-sdk/bin/pub 文件; 6)把文件倒數第三行的:pub.dart.snapshot 替換爲 mypub.dart.snapshot ; 7)保存-退出 8)從新執行發佈命令 若是執行了上述方法,在項目中執行pub get的時候會有版本衝突的錯誤,須要將上述方法修改的pub文件中的 mypub.dart.snapshot 恢復改成pub.dart.snaps hot 。
4月23日世界讀書日,微信公衆號免費送書啦~
掃碼關注「好將來技術」微信公衆號回覆「送書」便可參與本次活動
專屬寵粉福利,還在等什麼快來關注吧