1. 程式人生 > >iOS 主動與native 通訊

iOS 主動與native 通訊

flutter與Native互動是必不可少的,今天梳理一下,flutter監聽native訊息

大致流程

  1. flutter註冊EventChannel
  2. flutter EventChannel監聽native訊息
  3. 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命名建議

  1. Android採用 packagename + eventType + channelname
  2. iOS 採用 bundleidentifier + event type + channelname