flutter與Native交互是必不可少的,今天梳理一下,flutter監聽native消息bash
大體流程ide
代碼梳理ui
1 flutter Event監聽spa
const EventChannel("App/Event/Channel", const StandardMethodCodec());
//開始監聽
@override
void initState() {
// TODO: implement initState
super.initState();
_eventChannel
.receiveBroadcastStream("init")
.listen(_onEvent, onError: _onError);
}
// 數據接收
void _onEvent(Object value) {
print(value);
}
// 錯誤處理
void _onError(dynamic) {}
複製代碼
說明:對於receiveBroadcastStream建議添加名稱做爲native中傳遞數據的參數使用 2 native 經過Event廣播數據 2.1 初始化代理
FlutterEventChannel *eventChannel = [FlutterEventChannel eventChannelWithName:@"App/Event/Channel" binaryMessenger:flutterViewController];
[eventChannel setStreamHandler:self];
複製代碼
2.2 數據代理 FlutterStreamHandler
code
- (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments
eventSink:(FlutterEventSink)events {}//此處的arguments能夠轉化爲剛纔receiveBroadcastStream("init")的名稱,這樣咱們就能夠一個event來監聽多個方法實例
- (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments {}
複製代碼
傳遞數據實例:ci
#pragma mark - <FlutterStreamHandler>
// // 這個onListen是Flutter端開始監聽這個channel時的回調,第二個參數 EventSink是用來傳數據的載體。
- (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments
eventSink:(FlutterEventSink)events {
// arguments flutter給native的參數
// 回調給flutter, 建議使用實例指向,由於該block能夠使用屢次
if (events) {
NSMutableDictionary * params = [NSMutableDictionary dictionaryWithCapacity:0];
[params setValue:mReferNo forKey:@"ataNo"];
[params setValue:mDocType forKey:@"docType"];
[params setValue:self.aircraftNo forKey:@"aircraftNo"];
// [params setValue:[[NetworkingTools networkHeaders] modelToJSONString] forKey:@"headers"];
// [params setValue:[NetworkingTools networkHeaders] forKey:@"headers"];
[params setValue:@"我是標題" forKey:@"title"];
[params addEntriesFromDictionary:[NetworkingTools networkHeaders] ];
events([params modelToJSONString]);
}
return nil;
}
/// flutter再也不接收
- (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments {
// arguments flutter給native的參數
return nil;
}
複製代碼
最後是native端調用string
FlutterViewController * flutterViewController = [[FlutterViewController alloc] init];
[flutterViewController setInitialRoute:@"App"];
flutterViewController.view.backgroundColor = [UIColor whiteColor];
FlutterEventChannel *eventChannel = [FlutterEventChannel eventChannelWithName:@"App/Event/Channel" binaryMessenger:flutterViewController];
[eventChannel setStreamHandler:self];
複製代碼
經過以上梳理咱們基本就能夠進行native反向主動給flutter發送數據it
native發送數據是NSDictionry不要進行內部嵌套:@{@"key":@{}}這樣是不經過的io