一、flutter_boost
注意点:flutter的代码,flutter_boost通信需要将下面“发送/接收”代码写在已注册到flutter_boost的页面中
//routeFactory注册到flutter_boost的页面 @override Widget build(BuildContext context) { return FlutterBoostApp( routeFactory, appBuilder: appBuilder, ); } |
1.iOS
发送
[[FlutterBoost instance] sendEventToFlutterWith:@"event_to_flutter" arguments:@{@"tfs": tfsKey,@"key":@"loadPic"}]; |
接收
[[FlutterBoost instance] addEventListener:^(NSString *name, NSDictionary *arguments) { if (![name isEqualToString:@"event_to_native"]) { return; } NSString *key=arguments[@"key"]; } forName:@"event_to_native"]; |
2.flutter
发送
BoostChannel.instance.sendEventToNative("event_to_native", {"key":"loadPic"}); |
接收
late VoidCallback removeListener;
String filePath = "";
@override void initState() { super.initState(); removeListener = BoostChannel.instance.addEventListener("event_to_flutter", (key, arguments) {
if(arguments.isNotEmpty && arguments['key'] == "loadPic") { setState(() { filePath = getTFSUrl(arguments['tfs']); }); } return Future<dynamic>(() => null); }); }
@override void dispose() { super.dispose(); removeListener.call(); } |
二、MethodChannel
1.iOS
发送
FlutterMethodChannel *methodChannel = [FlutterMethodChannel methodChannelWithName:@"native_send_message_to_flutter" binaryMessenger:[[[FlutterBoost instance] engine] binaryMessenger]]; [methodChannel invokeMethod:@"will_logout" arguments: nil]; |
接收
|
2.flutter
发送
|
接收的代码需要写在runApp之后,否则需要在添加接收代码前添加WidgetsFlutterBinding.ensureInitialized()。应该是初始化一些必要的绑定,之后接收代码才可以生效。
接收
final MethodChannel _nativeSendMessageChannel = const MethodChannel('native_send_message_to_flutter'); _nativeSendMessageChannel.setMethodCallHandler((call) async { debugPrint('flutter _MyBoostAppState _nativeSendMessageChannel = ${call.method}'); if (call.method == 'will_logout') { SecurityRepository().reset(); } }); |
三、EventChannel
重点:setStreamHandler类似设置代理对象,所以需要在flutter添加接收代码前,native的EventChannel要提前设置,否则在flutter执行接收代码时,不会触发FlutterStreamHandler代理回调函数的执行,导致
eventSink为nill,native就无法执行发送任务
ios:
发送
@interface XXXXX() <FlutterStreamHandler> @property (nonatomic, strong) FlutterEventSink eventSink; @end
//设置 -(void)setEventChannel{ FlutterEventChannel *eventChannel = [FlutterEventChannel eventChannelWithName:@"native_eventChannel_send_message_to_flutter" binaryMessenger:[[[FlutterBoost instance] engine] binaryMessenger]]; [eventChannel setStreamHandler:self];//类似代理 }
//native发送给flutter的数据 -(void)sendEventChannelMessage:(NSDictionary *)dic{ if (self.eventSink) { self.eventSink(dic); } }
#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; }
|
flutter
接收
@override void initState() { // TODO: implement initState super.initState();
const EventChannel eventChannel = EventChannel('native_eventChannel_send_message_to_flutter'); eventChannel.receiveBroadcastStream().listen(_onEvent,onError: _onError); } // 数据接收 void _onEvent(dynamic value) { debugPrint("flutter_jl_bluetooth_plugin_event _onEvent: $value"); } // 数据接收: 错误处理 static void _onError(dynamic value) { debugPrint("flutter_jl_bluetooth_plugin_event _onError: $value"); } |