主要逻辑:
- Flutter端 EventChannel监听Native传来的消息
- Native通过创建EventChannel,给Flutter层发送消息
代码梳理
1、Flutter端创建EventChannel进行监听
import 'dart:async';
import 'package:flutter/services.dart';
class FlutterJlBluetoothPlugin {
// 工厂模式
factory FlutterJlBluetoothPlugin() =>_getInstance();
static FlutterJlBluetoothPlugin get instance => _getInstance();
static FlutterJlBluetoothPlugin? _instance;
MethodChannel _methodChannel;
EventChannel _eventChannel;
FlutterJlBluetoothPlugin._internal(this._methodChannel, this._eventChannel) {
_eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError);
}
static FlutterJlBluetoothPlugin _getInstance() {
if (_instance == null) {
MethodChannel methodChannel = MethodChannel('flutter_jl_bluetooth_plugin');
EventChannel eventChannel = EventChannel('flutter_jl_bluetooth_plugin_event');
_instance = new FlutterJlBluetoothPlugin._internal(methodChannel, eventChannel);
}
return _instance!;
}
/// 获取版本方法
Future<String> get platformVersion async {
final String version =
await _methodChannel.invokeMethod('getPlatformVersion');
return version;
}
/// 数据接收
static void _onEvent(dynamic value) {
print("flutter_jl_bluetooth_plugin_event _onEvent: $value");
}
/// 数据接收: 错误处理
static void _onError(dynamic value) {
print("flutter_jl_bluetooth_plugin_event _onError: $value");
}
}
说明:对于receiveBroadcastStream建议添加名称作为native中传递数据的参数使用
2、iOS端通过Event向Flutter发送数据
2.1 初始化与实现 FlutterStreamHandler的代理方法
#import "FlutterJlBluetoothPlugin.h"
#import "MJExtension.h"
@interface FlutterJlBluetoothPlugin() <FlutterStreamHandler>
@property (nonatomic, strong) FlutterEventSink eventSink;
@end
@implementation FlutterJlBluetoothPlugin
+ (instancetype)sharedInstance {
static FlutterJlBluetoothPlugin *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
FlutterMethodChannel *channel = [FlutterMethodChannel methodChannelWithName:@"flutter_jl_bluetooth_plugin" binaryMessenger:[registrar messenger]];
FlutterJlBluetoothPlugin *instance = [FlutterJlBluetoothPlugin sharedInstance];
[registrar addMethodCallDelegate:instance channel:channel];
FlutterEventChannel *eventChannel = [FlutterEventChannel eventChannelWithName:@"flutter_jl_bluetooth_plugin_event" binaryMessenger:[registrar messenger]];
[eventChannel setStreamHandler:instance];
}
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
if ([@"getPlatformVersion" isEqualToString:call.method]) {
result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);
} else {
result(FlutterMethodNotImplemented);
}
}
#pragma mark - FlutterStreamHandler
- (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments eventSink:(FlutterEventSink)eventSink {
self.eventSink = eventSink;
return nil;
}
- (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments {
self.eventSink = nil;
return nil;
}
@end
2.2 最后是native端调用
if (self.eventSink) self.eventSink([NSDictionary new]);