iOS 主动与native 通信

栏目: IOS · 发布时间: 6年前

内容简介:flutter与Native交互是必不可少的,今天梳理一下,flutter监听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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

学习JavaScript数据结构与算法(第2版)

学习JavaScript数据结构与算法(第2版)

[巴西] Loiane Groner / 邓 钢、孙晓博、吴 双、陈 迪、袁 源 / 人民邮电出版社 / 2017-9 / 49.00元

本书首先介绍了JavaScript 语言的基础知识以及ES6 和ES7 中引入的新功能,接下来讨论了数组、栈、队列、链表、集合、字典、散列表、树、图等数据结构,之后探讨了各种排序和搜索算法,包括冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序、顺序搜索、二分搜索,然后介绍了动态规划和贪心算法等常用的高级算法以及函数式编程,最后还介绍了如何计算算法的复杂度。一起来看看 《学习JavaScript数据结构与算法(第2版)》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具