Flutter Plugin開發(fā)流程

轉(zhuǎn)自 Q吹個大氣球Q

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

本文主要給大家介紹如何開發(fā)Flutter Plugin中Android的部分。有關(guān)Flutter以及Flutter Plugin的概念,感興趣的可以從官網(wǎng)查看相關(guān)資料。

簡介

筆者的環(huán)境是Mac下Android Studio進行的開發(fā),AS也是谷歌官推的,安裝flutter插件后,開發(fā)起來相對于其他IDE來說,方便很多,自帶了三種模板:

  • Flutter Application: Flutter應(yīng)用
  • Flutter Plugin:Flutter插件
  • Flutter Package:純Dart組件

Plugin其實就是一個特殊的Package。Flutter Plugin提供Android或者iOS的底層封裝,在Flutter層提供組件功能,使Flutter可以較方便的調(diào)取Native的模塊。很多平臺相關(guān)性或者對于Flutter實現(xiàn)起來比較復(fù)雜的部分,都可以封裝成Plugin。其原理如下

image

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

創(chuàng)建組件

直接在Android Studio中新建一個Flutter Plugin的工程,當(dāng)然也可以使用命令行來進行,例如創(chuàng)建一個flutter_text_plugin。

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

如果想支持swift或者kotlin,可以用如下命令進行創(chuàng)建:

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

更多的參數(shù)選項,大家可以 查看幫助文檔,當(dāng)然還是比較推薦直接用AS進行創(chuàng)建,簡單直觀。用AS打開項目,可以看到項目的組織結(jié)構(gòu)

root
    android
    example
    ios
    lib
    ...

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

編寫Android部分

用AS打開flutter_text_plugin/android項目,這樣子開發(fā)起來比較方便。但是打開過后,會發(fā)現(xiàn)出現(xiàn)了很多錯誤,提示找不到flutter相關(guān)的東西,我們仔細看這個項目,會發(fā)現(xiàn)跟我們平時用AS建的Android項目有所不同,少了很多部分,目錄也有所不同。這是因為這個android項目不需要能夠直接去運行,因此減少了很多東西。但是對于初次接觸的人來說,可能是一頭懵逼,例如該如何添加第三方庫,如何添加proguard rule等等。

引入flutter庫

android插件工程是沒有引入flutter庫的,所以才會出現(xiàn)錯誤提示,我們在項目根目錄建立一個libs文件夾,用來存放flutter庫。

flutter庫就在我們的flutter sdk中,路徑如下

<SDK Project>/bin/cache/artifacts/engine

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

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

添加第三方庫

添加第三方庫有兩種,一種是jar包引入,另一種通過gradle的方式進行。由于進行了第一步flutter庫的引入,這一步就簡單多了。查看build.gradle文件,可以看到最下面出現(xiàn)了如下的信息。

dependencies {
  compileOnly files('libs/flutter.jar')
}

看到這個,是不是就明朗多了,添加靜態(tài)庫以及添加在線庫都可以在這個地方進行。例如我添加一個bugly靜態(tài)庫以及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。我們發(fā)現(xiàn)項目中沒有proguard-rules.pro文件,因此這一步也需要我們自己去創(chuàng)建,在根目錄下,建立proguard-rules.pro文件,將混淆規(guī)則添加進去,然后修改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權(quán)限

添加了bugly以及okhttp3庫,需要對應(yīng)的權(quán)限申明,才能正常運行。直接在manifest文件下,添加對應(yīng)的權(quán)限

  <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"/>

插件開發(fā)

至此,準備工作都已就緒,你可以把這個項目當(dāng)做一個獨立的Android項目,在上面進行各種封裝操作,然后在FlutterTestPlugin文件下,將接口暴露出來。通過platform channels與flutter層關(guān)聯(lián)起來。

發(fā)布

當(dāng)插件開發(fā)完畢,可以將插件發(fā)布讓其他人使用,在發(fā)布之前,確保pubspec.yaml,、README.md以及CHANGELOG.md文件的內(nèi)容都正確填寫完畢??梢酝ㄟ^dry-run命令來看準備是否就緒。

flutter packages pub publish --dry-run

檢查無誤后,可以執(zhí)行下面的命令,發(fā)布到Pub上。

flutter packages pub publish

如何引用

對插件的引用有兩種,已經(jīng)發(fā)布的和未發(fā)布的。

引用發(fā)布的庫

flutter項目的很多資源管理都在根目錄的pubspec.yaml下面,類似于js中的一些包管理一樣,在dependencies加上我們需要引入的庫,例如引入url_launcher庫:

dependencies:
  url_launcher: ^0.4.2

如果這個庫包含了一些平臺相關(guān)的東西,例如需要在native層進行使用的話,則需要在對應(yīng)的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'

引用沖突

引用不同的庫可能會導(dǎo)致一些沖突,例如A和B兩個插件,都包含了C插件,但是所需的版本不同。因此我們可以采取以下措施避免這種問題:

  • 盡量使用范圍版本而不是指定一個特定的版本。
  • 強制統(tǒng)一沖突的插件版本
  • 對于native層,android可以通過force命令強制指定版本,而iOS這邊,Cocoapods則不支持引用的override功能。

引用未發(fā)布的庫

引用未發(fā)布的庫有兩種方式,通過本地路徑和git地址的方式:

基于Path的引用方式:

這種方式主要針對本地的未發(fā)布的庫,引用的路徑可以是相對或者絕對路徑。

dependencies:
  plugin1:
    path: ../plugin1/

基于Git的引用方式:

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

dependencies:
  package1:
    git:
      url: git://github.com/flutter/packages.git
      path: packages/package1   

參考

  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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容