Flutter與原生交互(iOS角度)

一. flutter與iOS的消息傳遞

Flutter和原生交互主要通過channel進(jìn)行通信猾浦,主要包括三類(以flutter開頭的類均是原生端類)

Flutter iOS
BasicMessageChannel FlutterBasicMessageChannel
MethodChannel FlutterMethodChannel
EventChannel FlutterEventChannel

下面以MethodChannelFlutterMethodChannel為例進(jìn)行說明
1. flutter端

 //1.初始化channel
 final platform = const  MethodChannel('samples.flutter.io/test');
  //2.設(shè)置回調(diào)方法
  void initState() {
    super.initState();
    platform.setMethodCallHandler(invokeFlutterMethod);
  }

  Future< Null > invokeFlutterMethod(MethodCall call) async{
    setState(() {
      content = call.arguments['text'];
    });
  }
  //3.在合適的地方(按鈕點(diǎn)擊事件)槽片,調(diào)用iOS方法
  Future _invokeIOSMethod() async {
    try {
      await platform.invokeMethod('invokeIOSMethod',{'text':'flutter傳過來的參數(shù)'});
    } on PlatformException catch (e) {    }
  }

2.iOS端

    //1.初始化FlutterViewController頁面(官方推薦方式)
    FlutterEngine *flutterEngine =
    ((AppDelegate *)UIApplication.sharedApplication.delegate).flutterEngine;
    FlutterViewController *flutterVC =
    [[FlutterViewController alloc] initWithEngine:flutterEngine nibName:nil bundle:nil];
    flutterVC.modalPresentationStyle = UIModalPresentationFullScreen;
    [self presentViewController:flutterVC animated:YES completion:nil];
    //2.初始化channel
    FlutterMethodChannel* channel = [FlutterMethodChannel
                                     methodChannelWithName:@"samples.flutter.io/test"
                                     binaryMessenger:flutterVC.binaryMessenger];
    //3.調(diào)用Flutter方法
    [channel invokeMethod:@"invokeFlutterMethod" arguments:@{@"text":@"ios傳給flutter的參數(shù)"}];
    //4.設(shè)置回調(diào)(等待Flutter調(diào)用)
    [channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
        if ([call.method isEqualToString:@"invokeIOSMethod"]) {
            [flutterVC dismissViewControllerAnimated:YES completion:nil];
        }
    }];

二.在iOS端切換flutter頁面

?閃退?返回控制器不銷毀随橘?內(nèi)存泄漏?
?解決方案:
官方人員(Dan Field)給出了答案
通過驗(yàn)證官方的例子锦庸,現(xiàn)總結(jié)如下:
1. 使用setInitialRoute 設(shè)置flutter頁面
自己的理解:重新初始化FlutterViewController內(nèi)部會重新創(chuàng)建FlutterEngine机蔗,導(dǎo)致flutter的代碼重新加載main函數(shù),然后通過window.defaultRouteName獲取新的路由值(這里路由值為full)甘萧,根據(jù)路由值加載對應(yīng)頁面

//FullScreenViewController繼承自FlutterViewController
  FullScreenViewController *flutterViewController =
      [[FullScreenViewController alloc] init];
  [flutterViewController setInitialRoute:@"full"];
//在交互的過程中萝嘁,官方代碼動畫過度都設(shè)置的NO,說是有問題扬卷,猜測是過渡不自然牙言,
 [self.navigationController
      pushViewController:flutterViewController
                animated:NO];

2.使用全局的FlutterEngine設(shè)置flutter頁面
實(shí)現(xiàn)過程:使用一個(gè)全局的channel來管理頁面切換,iOS通過發(fā)送channel回調(diào)來改變flutter頁面怪得,如:[[self reloadMessageChannel] sendMessage:@"full"];咱枉,具體看官方代碼
自己的理解:下面第一行代碼這種設(shè)置路由純屬多余卑硫,雖然路由值設(shè)置成功了(這里只能說是路由值,具體的路由頁面可不一定切換成功了)蚕断,因?yàn)橛玫氖侨?code>FlutterEngine獲取的FlutterViewController欢伏,此時(shí)是不加載fluttermain函數(shù)的。這種情況要想切換頁面必須通過channel進(jìn)行回調(diào)flutter端切換路由頁面的方法亿乳。所以我覺得下面的第一行代碼純屬多余硝拧,即使注釋掉也不影響。暫且把它當(dāng)作通過FlutterEngine設(shè)置路由值的一種方法吧风皿。

  [[self engine].navigationChannel invokeMethod:@"setInitialRoute"
                                      arguments:@"full"];
  [[self reloadMessageChannel] sendMessage:@"full"];

  FullScreenViewController *flutterViewController =
      [[FullScreenViewController alloc] initWithEngine:[self engine]
                                               nibName:nil
                                                bundle:nil];
  [self.navigationController
      pushViewController:flutterViewController
                animated:NO]; // Animating this is problematic.

??直接使用 FlutterViewController河爹,在連續(xù)返回然后進(jìn)入的操作下可能會閃退,建議在 FlutterViewController消失的情況下執(zhí)行以下代碼

-(void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];
  if (self.isMovingFromParentViewController) {
    // Note that if we were doing things that might cause the VC
    // to disappear (like using the image_picker plugin)
    // we shouldn't do this.  But in this case we know we're
    // just going back to the navigation controller.
    // If we needed Flutter to tell us when we could actually go away,
    // we'd need to communicate over a method channel with it.
    [self.engine setViewController:nil];
  }
}
  • 附加知識點(diǎn)

  1. 常量構(gòu)造函數(shù)的作用桐款?
    理解:const修飾的構(gòu)造函數(shù)咸这,要求成員變量必須都是final的,并且在構(gòu)造函數(shù)中要初始化
    在類內(nèi)部修飾const如果修飾成員變量魔眨,必須和static配合使用
class Hello {
  const Hello(this.name,this.age);
  
  final String name;
  final int age;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末媳维,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子遏暴,更是在濱河造成了極大的恐慌侄刽,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朋凉,死亡現(xiàn)場離奇詭異州丹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)杂彭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門墓毒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人亲怠,你說我怎么就攤上這事所计。” “怎么了团秽?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵主胧,是天一觀的道長。 經(jīng)常有香客問我习勤,道長踪栋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任姻报,我火速辦了婚禮己英,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吴旋。我一直安慰自己损肛,他們只是感情好厢破,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著治拿,像睡著了一般摩泪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劫谅,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天见坑,我揣著相機(jī)與錄音,去河邊找鬼捏检。 笑死荞驴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贯城。 我是一名探鬼主播熊楼,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼能犯!你這毒婦竟也來了鲫骗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤踩晶,失蹤者是張志新(化名)和其女友劉穎执泰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渡蜻,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡术吝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茸苇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顿苇。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖税弃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凑队,我是刑警寧澤则果,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站漩氨,受9級特大地震影響西壮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叫惊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一款青、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霍狰,春花似錦抡草、人聲如沸饰及。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽燎含。三九已至,卻和暖如春腿短,著一層夾襖步出監(jiān)牢的瞬間屏箍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工橘忱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赴魁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓钝诚,卻偏偏與公主長得像颖御,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子敲长,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348