Flutter和Native之间通信

一、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");

}

猜你喜欢

转载自blog.csdn.net/mofengluo/article/details/128852323