iOS 主動與native 通訊
阿新 • • 發佈:2018-12-14
flutter與Native互動是必不可少的,今天梳理一下,flutter監聽native訊息
大致流程
- flutter註冊EventChannel
- flutter EventChannel監聽native訊息
- native通過EventChannel傳送訊息
程式碼梳理
1 flutter Event監聽
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
- (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments
eventSink:(FlutterEventSink)events {}//此處的arguments可以轉化為剛才receiveBroadcastStream("init" )的名稱,這樣我們就可以一個event來監聽多個方法例項
- (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments {}
複製程式碼
傳遞資料例項:
#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端呼叫
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傳送資料
問題踩坑
native傳送資料是NSDictionry不要進行內部巢狀:@{@"key":@{}}這樣是不通過的
channel命名建議
- Android採用 packagename + eventType + channelname
- iOS 採用 bundleidentifier + event type + channelname