Flutter的插件就是一個庫齐帚,只是這個庫比較特殊陨簇,可以用來跟原生打交道吐绵,比如調(diào)用藍(lán)牙、WiFi河绽、相機(jī)等己单。Flutter和原生(iOS和安卓)之間,是通過MethodChannel
平臺通道來進(jìn)行通信的耙饰,之間的通信纹笼,都是異步方式。
1. 新建插件
新建Project:
第一步
在彈出的窗口中苟跪,選擇Flutter廷痘,然后在如下界面的type選項選擇Plugin,插件項目命名為plugin_test
:
第二步
然后運(yùn)行新建的該插件件已,發(fā)現(xiàn)屏幕中顯示對應(yīng)平臺的版本號牍疏。
2. 分析新建插件
對上一步新建的插件,我們通過分析來學(xué)習(xí)如何做到Flutter與原生平臺交互(顯示原生平臺的版本號)拨齐。
打開剛才新建的插件項目,發(fā)現(xiàn)跟普通的Flutter項目目錄結(jié)構(gòu)基本相同昨寞,
其中的 plugin_test.dart 文件是用來對外提供接口的文件:
// 通過平臺通道進(jìn)行通信瞻惋,都是異步的
import 'dart:async';
// services庫提供與底層通訊的方法
import 'package:flutter/services.dart';
class PluginTest {
// 定義一個通道方法。注意他的參數(shù)通常為字符串援岩,且必須跟原生代碼的一致歼狼,否則無法通信
static const MethodChannel _channel =
const MethodChannel('plugin_test');
// 定義platformVersion方法,此方法用來提供對外服務(wù)享怀,須異步處理
static Future<String> get platformVersion async {
// 調(diào)用原生程序獲取系統(tǒng)版本號
final String version = await _channel.invokeMethod('getPlatformVersion');
return version;
}
}
下面來分析新建的插件項目中的iOS部分的文件:
建議使用如下方式編輯iOS端或者安卓端代碼羽峰,否則無法斷點調(diào)試原生代碼
在Xcode項目中,找到同名文件PluginTestPlugin.h:
#import <Flutter/Flutter.h>
@interface PluginTest1Plugin : NSObject<FlutterPlugin>
@end
.m文件為:
@implementation PluginTest1Plugin
// 實現(xiàn)協(xié)議中的注冊方法,這個方法主要是用來定義與上層代碼通信的通道
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
FlutterMethodChannel* channel = [FlutterMethodChannel methodChannelWithName:@"plugin_test1" binaryMessenger:[registrar messenger]];
PluginTest1Plugin* instance = [[PluginTest1Plugin alloc] init];
[registrar addMethodCallDelegate:instance channel:channel];
}
// 實現(xiàn)協(xié)議中的注冊方法梅屉,用來響應(yīng)上層調(diào)用
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
if ([@"getPlatformVersion" isEqualToString:call.method]) {
result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);
} else {
result(FlutterMethodNotImplemented);
}
}
@end
3. 測試插件
插件開發(fā)完以后值纱,我們可以在插件項目的Example目錄下的lib下的main.dart
文件進(jìn)行測試