iOS混編Flutter 之我見二

前言

上一篇主要介紹iOS工程 和 Flutter工程編譯器上的操作,那么本文就來介紹下代碼上如何交互不见。

iOS 和Flutter界面跳轉(zhuǎn)

1、iOS跳轉(zhuǎn)Flutter工程

iOS跳轉(zhuǎn)Flutter工程這個是最簡單也是最容易的一種崔步,我們只需在已經(jīng)配置好的iOS工程(不知道怎么配置可看iOS混編Flutter 之我見一
如下操作:
頭文件引入Flutter

import UIKit
import Flutter

iOS跳轉(zhuǎn)代碼

let vc : FlutterViewController = FlutterViewController.init();
 vc.fd_prefersNavigationBarHidden = true;//隱藏iOS工程導(dǎo)航欄
 self.navigationController?.pushViewController(vc, animated: true);
2稳吮、iOS跳轉(zhuǎn)Flutter工程指定界面

跳轉(zhuǎn)到指定界面相比上面來說會復(fù)雜一點,我們查看FlutterViewController的Api會發(fā)現(xiàn)井濒,內(nèi)部有這樣一個方法

/**
 * Sets the first route that the Flutter app shows. The default is "/".
 * This method will guarnatee that the initial route is delivered, even if the
 * Flutter window hasn't been created yet when called. It cannot be used to update
 * the current route being shown in a visible FlutterViewController (see pushRoute
 * and popRoute).
 *
 * @param route The name of the first route to show.
 */
- (void)setInitialRoute:(NSString*)route;

這時候我們就可以用這個Api來跳轉(zhuǎn)指定的界面,比如我這邊route到Home
Flutter 中main.dart端代碼

import 'dart:ui' as ui; // 調(diào)用window拿到route判斷跳轉(zhuǎn)哪個界面

void main() => runApp(jumpToRoute(ui.window.defaultRouteName));
Widget jumpToRoute(String route) {
  switch (route) {
    case 'fav':
      return Fav();//route到Fav界面
    case 'home':
      return Home();//route到home界面
    case 'detail':
      return Detail();//route到Detail界面
    default:
      return Main();//route到整個app
  }
}

Flutter中Home界面代碼

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
      ),
      home:MyHomeCtrl(title: "",),
    );
  }
}
class MyHomeCtrl extends StatefulWidget{
  MyHomeCtrl({Key key, this.title}) : super(key: key);

  final String title;
  @override
  State<StatefulWidget> createState() {
    return _MyHomeState();
  }
}

接下來我們來看看iOS端的跳轉(zhuǎn)代碼

 let vc : FlutterViewController = FlutterViewController.init();
  vc.fd_prefersNavigationBarHidden = true;
  vc.setInitialRoute("home");
  self.navigationController?.pushViewController(vc, animated: true);
3灶似、iOS跳轉(zhuǎn)Flutter工程指定界面并發(fā)送數(shù)據(jù)

其實3和4很多時候是合在一起的這邊為了方便大家理解把他們分開講,為了方便理解我畫了一個圖如下瑞你。


iOS和Flutter交互圖

簡單講就是跳轉(zhuǎn)Flutter界面的時候發(fā)送一組字典數(shù)據(jù)酪惭,F(xiàn)lutter收到這組數(shù)據(jù)的時候去請求數(shù)據(jù)。這是3者甲,我們來看看代碼上的實現(xiàn)春感。
iOS中跳轉(zhuǎn)的代碼實現(xiàn)

let vc : FlutterViewController = FlutterViewController.init();
vc.fd_prefersNavigationBarHidden = true;
vc.setInitialRoute("detail");
let eventChannel : FlutterEventChannel = FlutterEventChannel.init(name: "com.pages.event/detail", binaryMessenger: vc.binaryMessenger);
eventChannel.setStreamHandler(self);
self.navigationController?.pushViewController(vc, animated: true);

FlutterStreamHandler協(xié)議的實現(xiàn)

extension GKAboutController : FlutterStreamHandler{
    func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
        //向flutter發(fā)送數(shù)據(jù)
        print(arguments as Any);
        let param :[String : String] = ["gender":"male","major":"玄幻"];
        events(param)
        return nil;
    }
    
    func onCancel(withArguments arguments: Any?) -> FlutterError? {
        print(arguments as Any);
        return nil;
    }
}

Flutter中Detail界面代碼
頭文件引入

import 'package:flutter/services.dart';
class Detail extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
      ),
      home:DetailCtrl(title: "",),
    );
  }
}

監(jiān)聽數(shù)據(jù)、類似iOS中的通知(注意Channel定義要和iOS的定義一致)

  static const methodChannel = const MethodChannel('com.pages.method/detail');  //Flutter向iOS發(fā)送數(shù)據(jù)
  static const eventChannel = const EventChannel('com.pages.event/detail');//接收iOS向Flutter發(fā)送過來的數(shù)據(jù)

接收數(shù)據(jù)

  @override
  void initState(){
    super.initState();
    eventChannel.receiveBroadcastStream(1).listen(onEvent,onError: onError);
    loadData();
  }
  void onEvent(Object event) {
    Map map = event;
    String gender =  map["gender"];
    String title =  map["major"];
    widget.gender = gender;
    widget.title = title;
    loadData();
  }
  // 錯誤返回
  void onError(Object error) {
    print(error.toString());
  }

這時候我們就可以拿到gender和major 這兩個數(shù)據(jù)的值,難后去做網(wǎng)絡(luò)請求鲫懒,獲取網(wǎng)絡(luò)數(shù)據(jù)嫩实。

4、Flutter跳轉(zhuǎn)iOS工程指定界面并發(fā)送數(shù)據(jù)

通過3我們了解到了iOS想Flutter發(fā)送數(shù)據(jù)窥岩,有時候僅僅發(fā)送數(shù)據(jù)是不夠的甲献,我們還需要接收數(shù)據(jù),所以很多時候發(fā)送數(shù)據(jù)和接收數(shù)據(jù)是聯(lián)系起來的颂翼。

在上面3中Flutter定義監(jiān)聽我們還多定義了一個

static const methodChannel = const MethodChannel('com.pages.method/detail');  //Flutter向iOS發(fā)送數(shù)據(jù)

這個就是Flutter要向iOS發(fā)送數(shù)據(jù)的監(jiān)聽晃洒,我們看下Flutter是如何向iOS發(fā)送數(shù)據(jù)的,上代碼
Fluttre代碼實現(xiàn)

methodChannel.invokeMethod('detail',{"bookId":male.sId});

這里的detail有時候我們需要發(fā)送多種數(shù)據(jù)朦乏,我們就可以用這個字段區(qū)分開球及。

看看iOS 代碼的實現(xiàn)

       let vc : FlutterViewController = FlutterViewController.init();
        vc.fd_prefersNavigationBarHidden = true;
        vc.setInitialRoute("detail");
        
        //iOS 向Flutter發(fā)送數(shù)據(jù)的EventChanne(EventChanne同F(xiàn)lutter)
        let eventName  = "com.pages.event/detail";
        let eventChannel : FlutterEventChannel = FlutterEventChannel.init(name:eventName, binaryMessenger: vc.binaryMessenger);
        eventChannel.setStreamHandler(self);
        
        //iOS 接收Flutter發(fā)送過來數(shù)據(jù)的MethodChannel(MethodChannel同F(xiàn)lutter)
        let methodName = "com.pages.method/detail";
        let methodChannel : FlutterMethodChannel = FlutterMethodChannel.init(name:methodName, binaryMessenger: vc.binaryMessenger);
        methodChannel.setMethodCallHandler { (call, result) in
            if call.method == "detail"{
                let json = JSON(call.arguments as Any);
                let bookId = json["bookId"].stringValue
                GKJump.jumpToDetail(bookId:bookId);
            }
            print(call.method);

            print(call.arguments as Any);
        };
        self.navigationController?.pushViewController(vc, animated: true);

看下交互效果圖吧


交互.gif

以上4步基本上實現(xiàn)了iOS和Flutter代碼交互的邏輯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末集歇,一起剝皮案震驚了整個濱河市桶略,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诲宇,老刑警劉巖际歼,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異姑蓝,居然都是意外死亡鹅心,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門纺荧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旭愧,“玉大人,你說我怎么就攤上這事宙暇∈淇荩” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵占贫,是天一觀的道長桃熄。 經(jīng)常有香客問我,道長型奥,這世上最難降的妖魔是什么瞳收? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮厢汹,結(jié)果婚禮上螟深,老公的妹妹穿的比我還像新娘。我一直安慰自己烫葬,他們只是感情好界弧,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般夹纫。 火紅的嫁衣襯著肌膚如雪咽瓷。 梳的紋絲不亂的頭發(fā)上设凹,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天舰讹,我揣著相機與錄音,去河邊找鬼闪朱。 笑死月匣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奋姿。 我是一名探鬼主播锄开,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼称诗!你這毒婦竟也來了萍悴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤寓免,失蹤者是張志新(化名)和其女友劉穎癣诱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袜香,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡撕予,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜈首。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片实抡。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖欢策,靈堂內(nèi)的尸體忽然破棺而出吆寨,到底是詐尸還是另有隱情,我是刑警寧澤踩寇,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布啄清,位于F島的核電站,受9級特大地震影響姑荷,放射性物質(zhì)發(fā)生泄漏盒延。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一鼠冕、第九天 我趴在偏房一處隱蔽的房頂上張望添寺。 院中可真熱鬧,春花似錦懈费、人聲如沸计露。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽票罐。三九已至叉趣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間该押,已是汗流浹背疗杉。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚕礼,地道東北人烟具。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像奠蹬,于是被迫代替她去往敵國和親朝聋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355