Flutter和Native交互:Fluter Boost 方法交互及內(nèi)存問(wèn)題

Flutter和Native混合開(kāi)發(fā),F(xiàn)luuter和Native方法互相調(diào)用很容易出現(xiàn)內(nèi)存問(wèn)題,網(wǎng)上的很多例子都是不全的?。】催@篇就夠了??!

flutter側(cè):調(diào)用Native的xxx方法

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

iOS側(cè):監(jiān)聽(tīng)flutter 調(diào)用的xxx方法

// 監(jiān)聽(tīng)來(lái)自flutter的事件 xxx
FLBVoidCallback __block xxxBlock = [FlutterBoostPlugin.sharedInstance addEventListener:^(NSString *name, NSDictionary *arguments) {
        if([name isEqualToString:@"xxx"]) {
            /// 回調(diào)給flutter,flutter需要監(jiān)聽(tīng)aaa(即: Native調(diào)用Flutter方法aaa)
            [FlutterBoostPlugin.sharedInstance sendEvent:@"aaa" arguments:@{@"a":@"a",@"b":@"b"}];
        }
        /// 這一行很多網(wǎng)上都沒(méi)寫(xiě) 但是是需要的 用完了就釋放
        xxxBlock();
    } forName:@"xxx"];

flutter側(cè):監(jiān)聽(tīng)Native的aaa回調(diào)方法(在widget的initState() 中寫(xiě))

   bool _status = false;
   /// 這一個(gè)很多網(wǎng)上都沒(méi)有 但是這個(gè)是必須的  需要在dispose中釋放
   VoidCallback aaaCallBack;
   /// 監(jiān)聽(tīng)Native側(cè)的事件-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();
      /// 這一個(gè)很多網(wǎng)上都沒(méi)有 但是這個(gè)是必須的  widget銷毀后調(diào)用這個(gè)方法,釋放eventListener
      aaaCallBack();
    }

注意:

經(jīng)實(shí)踐:sendEvent的參數(shù)arguments 只能是 {String:String} ,各位如果調(diào)用失敗可以查一下是否是因?yàn)檫@個(gè)參數(shù)問(wèn)題!
除了sendEvent+addEventListener 這種方法外,也可以用頁(yè)面交互的open方法處理事件也可以,但不建議這么做哈

總結(jié)一下內(nèi)存問(wèn)題:

  1. iOS側(cè)的FLBVoidCallback 需要執(zhí)行釋放
  2. Fluuter側(cè)的VoidCallback 需要在dispose的時(shí)候釋放
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容