Flutter Plugin開發流程

這篇文章主要介紹了Flutter Plugin開發流程,包括如何利用Android Studio開發以及發佈等。java

本文主要給你們介紹如何開發Flutter Plugin中Android的部分。有關Flutter以及Flutter Plugin的概念,感興趣的能夠從官網查看相關資料。android

簡介

筆者的環境是Mac下Android Studio進行的開發,AS也是谷歌官推的,安裝flutter插件後,開發起來相對於其餘IDE來講,方便不少,自帶了三種模板:ios

  • Flutter Application: Flutter應用
  • Flutter Plugin:Flutter插件
  • Flutter Package:純Dart組件

Plugin其實就是一個特殊的Package。Flutter Plugin提供Android或者iOS的底層封裝,在Flutter層提供組件功能,使Flutter能夠較方便的調取Native的模塊。不少平臺相關性或者對於Flutter實現起來比較複雜的部分,均可以封裝成Plugin。其原理以下git

消息在client和host之間經過平臺通道(platform channels)來進行的,之間的通信都是異步的。github

建立組件

直接在Android Studio中新建一個Flutter Plugin的工程,固然也可使用命令行來進行,例如建立一個flutter_text_plugin。swift

flutter create --org com.example --plugin flutter_text_pluginbash

若是想支持swift或者kotlin,能夠用以下命令進行建立:異步

flutter create --org com.example --plugin -i swift -a kotlin flutter_text_pluginide

更多的參數選項,你們能夠 查看幫助文檔,固然仍是比較推薦直接用AS進行建立,簡單直觀。用AS打開項目,能夠看到項目的組織結構post

root
	android
	example
	ios
	lib
	...
複製代碼

android以及ios文件夾是咱們將要編寫插件的native層的地方,lib文件夾是編寫與native層映射的地方,native與flutter之間不能直接通訊,必須經過MethodChannel來間接調用。example文件夾則是例子工程,編寫的插件能夠直接在這個項目中進行驗證。在本文中,咱們主要在android目錄下進行,也就是android部分。

編寫Android部分

用AS打開flutter_text_plugin/android項目,這樣子開發起來比較方便。可是打開事後,會發現出現了不少錯誤,提示找不到flutter相關的東西,咱們仔細看這個項目,會發現跟咱們平時用AS建的Android項目有所不一樣,少了不少部分,目錄也有所不一樣。這是由於這個android項目不須要可以直接去運行,所以減小了不少東西。可是對於初次接觸的人來講,多是一頭懵逼,例如該如何添加第三方庫,如何添加proguard rule等等。

引入flutter庫

android插件工程是沒有引入flutter庫的,因此纔會出現錯誤提示,咱們在項目根目錄創建一個libs文件夾,用來存放flutter庫。

flutter庫就在咱們的flutter sdk中,路徑以下

/bin/cache/artifacts/engine

engine下面包含了各類平臺的flutter庫,咱們隨便拷貝一個Android平臺的庫到libs文件夾下,右鍵flutter.jar,彈出菜單選擇Add As Library...

通過這一步,項目中不會再報錯了,可是,因爲整個flutter plugin包含了flutter庫,所以不能只是簡單的添加就了事了,點擊菜單Project Structure...,找到flutter_text_plugin的Dependencies中,將flutter庫的Scope從Implementation改爲Compile Only。至此,引入flutter庫的工做完成了,能夠進行插件的編寫操做了。

添加第三方庫

添加第三方庫有兩種,一種是jar包引入,另外一種經過gradle的方式進行。因爲進行了第一步flutter庫的引入,這一步就簡單多了。查看build.gradle文件,能夠看到最下面出現了以下的信息。

dependencies {
  compileOnly files('libs/flutter.jar')
}
複製代碼

看到這個,是否是就明朗多了,添加靜態庫以及添加在線庫均可以在這個地方進行。例如我添加一個bugly靜態庫以及okhttp3庫:

dependencies {
  compileOnly files('libs/flutter.jar')
  implementation 'com.squareup.okhttp3:okhttp:3.10.0'
  implementation files('libs/bugly_crash_release.jar')
}
複製代碼

添加proguard rule

因爲了bugly以及okhttp3庫,所以須要添加progurad rule。咱們發現項目中沒有proguard-rules.pro文件,所以這一步也須要咱們本身去建立,在根目錄下,創建proguard-rules.pro文件,將混淆規則添加進去,而後修改build.gradle文件,添加以下信息,跟普通Android項目差很少:

buildTypes {
    release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
複製代碼

Android權限

添加了bugly以及okhttp3庫,須要對應的權限申明,才能正常運行。直接在manifest文件下,添加對應的權限

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-permission android:name="android.permission.READ_LOGS"/>
複製代碼

插件開發

至此,準備工做都已就緒,你能夠把這個項目當作一個獨立的Android項目,在上面進行各類封裝操做,而後在FlutterTestPlugin文件下,將接口暴露出來。經過platform channels與flutter層關聯起來。

發佈

當插件開發完畢,能夠將插件發佈讓其餘人使用,在發佈以前,確保pubspec.yaml,、README.md以及CHANGELOG.md文件的內容都正確填寫完畢。能夠經過dry-run命令來看準備是否就緒。

flutter packages pub publish --dry-run

檢查無誤後,能夠執行下面的命令,發佈到Pub上。

flutter packages pub publish

如何引用

對插件的引用有兩種,已經發布的和未發佈的。

引用發佈的庫

flutter項目的不少資源管理都在根目錄的pubspec.yaml下面,相似於js中的一些包管理同樣,在dependencies加上咱們須要引入的庫,例如引入url_launcher庫:

dependencies:
  url_launcher: ^0.4.2
複製代碼

若是這個庫包含了一些平臺相關的東西,例如須要在native層進行使用的話,則須要在對應的native項目單獨作引用。

Android

修改android/build.gradle的dependencies處作引用:

dependencies {
        provided rootProject.findProject(":url_launcher")
    }
複製代碼

iOS

修改ios/hello.podspec文件

Pod::Spec.new do |s|
  # lines skipped
  s.dependency 'url_launcher'
複製代碼

引用衝突

引用不一樣的庫可能會致使一些衝突,例如A和B兩個插件,都包含了C插件,可是所需的版本不一樣。所以咱們能夠採起如下措施避免這種問題:

  • 儘可能使用範圍版本而不是指定一個特定的版本。
  • 強制統一衝突的插件版本
  • 對於native層,android能夠經過force命令強制指定版本,而iOS這邊,Cocoapods則不支持引用的override功能。

引用未發佈的庫

引用未發佈的庫有兩種方式,經過本地路徑和git地址的方式:

基於Path的引用方式:

這種方式主要針對本地的未發佈的庫,引用的路徑能夠是相對或者絕對路徑。

dependencies:
  plugin1:
    path: ../plugin1/
複製代碼

基於Git的引用方式:

這種方式針對存放在git上的庫,其中path是可選的,能夠定位到某個子目錄

dependencies:
  package1:
    git:
      url: git://github.com/flutter/packages.git
      path: packages/package1   
複製代碼

擴展

Flutter - 不同的跨平臺解決方案介紹了Flutter平臺,對Flutter平臺技術進行了簡要的分析,並從多個維度去調研探討Flutter在商用環境的可行性,歡迎你們閱讀。

後話

筆者新建了一個flutter學習相關的項目,github地址,裏面包含了筆者寫的關於flutter學習相關的一些文章,後期也會按期更新,也會上傳一些學習demo,歡迎你們關注。

參考

  1. Flutter進階—平臺插件
  2. Flutter - Creating a Plugin
  3. Flutter for Android Developers
  4. Writing custom platform-specific code with platform channels
  5. Developing Packages & Plugins
  6. Using Packages
相關文章
相關標籤/搜索