Flutter和Native交互:Fluter Boost 方法交互及内存问题

Flutter和Native混合开发,Fluuter和Native方法互相调用很容易出现内存问题,网上的很多例子都是不全的!!看这篇就够了!!

flutter侧:调用Native的xxx方法

      Map<String,dynamic> tmp = Map<String,dynamic>();
      try {
        /// 调用Native的方法xxx
        FlutterBoost.singleton.channel.sendEvent('xxx', tmp);
      } catch (e) {
      }

iOS侧:监听flutter 调用的xxx方法

// 监听来自flutter的事件 xxx
FLBVoidCallback __block xxxBlock = [FlutterBoostPlugin.sharedInstance addEventListener:^(NSString *name, NSDictionary *arguments) {
        if([name isEqualToString:@"xxx"]) {
            /// 回调给flutter,flutter需要监听aaa(即: Native调用Flutter方法aaa)
            [FlutterBoostPlugin.sharedInstance sendEvent:@"aaa" arguments:@{@"a":@"a",@"b":@"b"}];
        }
        /// 这一行很多网上都没写 但是是需要的 用完了就释放
        xxxBlock();
    } forName:@"xxx"];

flutter侧:监听Native的aaa回调方法(在widget的initState() 中写)

   bool _status = false;
   /// 这一个很多网上都没有 但是这个是必须的  需要在dispose中释放
   VoidCallback aaaCallBack;
   /// 监听Native侧的事件-aaa
   aaaCallBack = FlutterBoost.singleton.channel.addEventListener('aaa',
           (name, arguments){
         /// 刷新界面
         String a = arguments['a'];
         String b = arguments['b'];
         if (widget.a is String
             && a is String
             && widget.b == b) {
           _status = status == '1' ? true : false;
           setState(() {
           });
         }
         return;
       });

     @override
     void dispose() {
      // TODO: implement dispose
      super.dispose();
      /// 这一个很多网上都没有 但是这个是必须的  widget销毁后调用这个方法,释放eventListener
      aaaCallBack();
    }

注意:

经实践:sendEvent的参数arguments 只能是 {String:String} ,各位如果调用失败可以查一下是否是因为这个参数问题!
除了sendEvent+addEventListener 这种方法外,也可以用页面交互的open方法处理事件也可以,但不建议这么做哈

总结一下内存问题:

  1. iOS侧的FLBVoidCallback 需要执行释放
  2. Fluuter侧的VoidCallback 需要在dispose的时候释放
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容