這篇指南是針對Android開發者的,目的是讓一個沒有接觸過Flutter的Android程序員快速開發出Flutter插件, 所以筆者默認各位讀者已經有了JDK、SDK、Android Studio等開發環境和IDE。
Flutter環境搭建
1.下載Flutter SDK
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。
- 通過以下命令,驗證項目沒有問題:
flutter packages pub publish --dry-run
- 通過以下命令發布:
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