Android與Flutter橋接指南

Flutter官方文檔

這篇指南是針對Android開發者的,目的是讓一個沒有接觸過Flutter的Android程序員快速開發出Flutter插件, 所以筆者默認各位讀者已經有了JDK、SDK、Android Studio等開發環境和IDE。

Flutter環境搭建

1.下載Flutter SDK

Flutter SDK Archive

2.解壓下載到的壓縮包

解壓路徑如D:\env\flutter,不要解壓到Program Files目錄下,因為操作該目錄需要更高的權限。

3.安裝Flutter

進入flutter根目錄,雙擊flutter_console.bat,等待flutter安裝完成。

tips:

如果想要在一般的cmd中直接使用flutter commands,需要配置環境變量:
將你的flutter\bin路徑添加到環境變量path
然后重新打開cmd,運行flutter help確認結果

4.確認Flutter環境

運行以下命令:

flutter doctor

一般輸出如下:

C:\Users\wxj>flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[a??] Flutter (Channel stable, v1.2.1, on Microsoft Windows [Version 6.1.7601],
    locale zh-CN)
[!] Android toolchain - develop for Android devices (Android SDK version 28.0.3)

    ! Some Android licenses not accepted.  To resolve this, run: flutter doctor
      --android-licenses
[!] Android Studio (version 2.3)
    X Flutter plugin not installed; this adds Flutter specific functionality.
    X Dart plugin not installed; this adds Dart specific functionality.
[!] Android Studio (version 3.2)
    X Flutter plugin not installed; this adds Flutter specific functionality.
    X Dart plugin not installed; this adds Dart specific functionality.
[!] Connected device
    ! No devices available

! Doctor found issues in 4 categories.

C:\Users\wxj>

可見檢查出了4個問題,除了Android Studio沒有安裝flutter插件的提示外,其他沒什么需要注意的。

5.Android Studio安裝Flutter插件

  • 啟動AS
  • 進入插件頁面 (Preferences > Plugins on macOS, File > Settings > Plugins on Windows & Linux).
  • 選擇Browse repositories, 搜索flutter,安裝Flutter plugin
  • 安裝完成后重啟AS

測試Flutter開發環境

創建一個test工程,測試flutter開發環境。

  • 選擇File > New Flutter Project
  • 選擇Flutter application作為應用類型
  • Flutter SDK Path一欄指定你的flutter SDK安裝路徑
  • 輸入項目名稱,點擊下一步
  • 等待AS創建工程
  • 運行main.dart(第一次運行需要較長時間的編譯)

運行成功后設備上會看到如下頁面

說明flutter開發環境已就緒。接下來就可以開發你的flutter插件了。

開發你的Flutter項目

在開始前,首先要確定你是要開發一個dart package還是一個plugin package,我們是要為既存的sdk開發一個flutter插件,所以是plugin package。

創建項目有兩種方式:命令行 和 Android Studio/create flutter project,下面是命令行創建,你也可以通過Android Studio的UI創建,注意在創建時選對你要創建Dart package還是plugin package即可。

dart package

Dart package是通過 --template=package 創建的:

 flutter create --template=package hello

該命令會創建一個 hello/ 目錄,其中包括:

  • lib/hello.dart:
    該包的Dart代碼.
  • test/hello_test.dart:
    該包的單元測試代碼.

plugin package

創建package

plugin package是通過 --template=plugin 創建的。

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

上述命令會創建一個 hello/ 文件夾,其內容如下:

  • lib/hello.dart:
    你要實現的插件的dart api
  • android/src/main/java/com/example/?hello/HelloPlugin.java:
    插件api的安卓平臺實現
  • ios/Classes/HelloPlugin.m:
    插件api的ios平臺實現
  • example/:
    flutter的示例應用

默認使用OC和java,如果想使用swift或者kotlin,那么可以指定,ios用-i,android用-a:

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

接下來就可以開發你的flutter plugin了,最后你可能會想要寫一些文檔,可以參考:
Adding documentation

發布到pub.dartlang.org

開發完成后你可以將你的插件發布到Pub site,方便用戶使用。

在發布之前,先確認一下pubspec.yaml文件中關于plugin的設置是否正確:

# The following section is specific to Flutter.
flutter:
  # This section identifies this Flutter project as a plugin project.
  # The androidPackage and pluginClass identifiers should not ordinarily
  # be modified. They are used by the tooling to maintain consistency when
  # adding or updating assets for this project.
  plugin:
    androidPackage: cn.smssdk.flutter
    pluginClass: MobsmsPlugin

這里要指定正確的plugin的包名和類名,androidPackage只有android用得到,而pluginClass則是iOS和Android都要用到的,所以類名需要統一。這里的設置會上傳到flutter服務器,當用戶在線集成你的plugin時,flutter會根據這個設置自動幫用戶生成下面這個類:

package io.flutter.plugins;

import io.flutter.plugin.common.PluginRegistry;
import cn.smssdk.flutter.MobsmsPlugin;

/**
 * Generated file. Do not edit.
 */
public final class GeneratedPluginRegistrant {
  public static void registerWith(PluginRegistry registry) {
    if (alreadyRegisteredWith(registry)) {
      return;
    }
    MobsmsPlugin.registerWith(registry.registrarFor("cn.smssdk.flutter.MobsmsPlugin"));
  }

  private static boolean alreadyRegisteredWith(PluginRegistry registry) {
    final String key = GeneratedPluginRegistrant.class.getCanonicalName();
    if (registry.hasPlugin(key)) {
      return true;
    }
    registry.registrarFor(key);
    return false;
  }
}

所以,如果之前沒有指定正確的plugin包名和類名, 就會導致自動生成的代碼中出現錯誤。

如果是在flutter項目下直接查看java代碼,可能會提示import cn.smssdk.flutter.MobsmsPlugin找不到,無法使用相關類,不用在意,你可以"右鍵flutter項目 → Flutter → Open Android Module in Android Studio",直接打開flutter的安卓項目,AS會自動下載相關依賴(包括插件中的module),在該視圖下編譯就不會有報錯了,并且這兩邊會自動同步,任意一邊運行項目都會產生同一個flutter apk。

  1. 通過以下命令,驗證項目沒有問題:
flutter packages pub publish --dry-run
  1. 通過以下命令發布:
flutter packages pub publish

用戶如何使用你的插件

以mobsms插件的集成為例。

1. dart代碼集成

在 hello/pubspec.yaml 中添加以下代碼:

dependencies:
  mobsms: ^0.0.3

在你項目的Dart中添加以下代碼:

 import 'package:mobsms/mobsms.dart'

這樣,就可以在你的main.dart中使用mobsms plugin中定義的dart api了。

2. 平臺相關(android/ios)代碼集成

Android

在 hello/android/build.gradle中添加:

android {
    // lines skipped
    dependencies {
        provided rootProject.findProject(":mobsms")
    }
}

這樣就可以在你的hello/android/src下的類中import cn.smssdk.flutter.MobsmsPlugin并使用MobsmsPlugin中的api了。

Java代碼仍然建議在Android視圖下查看,不要在Flutter視圖下查看。

iOS

hello/ios/hello.podspec中:

Pod::Spec.new do |s|
  # lines skipped
  s.dependency 'mob_smssdk'

這樣就可以在你的hello/ios/Classes下的類中#import "MobsmsPlugin.h"并使用MobsmsPlugin中的api了。

更多信息可參考 Handling package interdependencies

Demo

如果你是要開發一個Plugin Package,可以參考 mobsms
SMSSDK-for-Flutter

如果你要開發一個Dart Package,需要集成第三方Plugin Package,可以參考:
sms_flutter_tester

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374