原生iOS工程嵌入Flutter(二)

原生iOS工程嵌入Flutter(一)

上一篇講如何在原生oc工程中簡(jiǎn)單的嵌入Flutter頁(yè)面乖坠。那如果有多個(gè)Flutter頁(yè)面咋辦玻熙?原生的頁(yè)面和Flutter頁(yè)面又如何做通訊呢绷蹲?

如果有多個(gè)Flutter頁(yè)面,那么我們就不能像之前那樣去簡(jiǎn)單的創(chuàng)建一個(gè)FlutterViewController了赶掖。通常要把Flutter engine抽出來(lái)做成一個(gè)單利镊靴,通過(guò)Flutter engine來(lái)初始化FlutterViewController。

  1. 現(xiàn)在Flutter module端創(chuàng)建2個(gè)flutter頁(yè)面锉桑。showCode:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // This widget is the root of your application.
  String pageIndex = 'one';
  final MethodChannel methodChannel1 = MethodChannel('one_page');
  final MethodChannel methodChannel2 = MethodChannel('two_page');
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    methodChannel1.setMethodCallHandler((call) {
      if (call.method == 'initParms') {
        Map parms = call.arguments;
        setState(() {
          pageIndex = parms['pageName'].toString();
        });
      }
      return null;
    });

    methodChannel2.setMethodCallHandler((call) {
      if (call.method == 'initParms') {
        Map parms = call.arguments;
        setState(() {
          pageIndex = parms['pageName'].toString();
        });
      }
      return null;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: _rootPage(pageIndex));
  }

  Widget _rootPage(String pageIndex) {
    if (pageIndex == 'one') {
      return Scaffold(
        appBar: AppBar(
          title: Text('$pageIndex'),
        ),
        body: Center(
            child: RaisedButton(
          onPressed: () {
            MethodChannel('one_page').invokeMapMethod('popTo');
          },
          child: Text('頁(yè)面$pageIndex'),
        )),
      );
    } else if (pageIndex == 'two') {
      return Scaffold(
        appBar: AppBar(
          title: Text('$pageIndex'),
        ),
        body: Center(
          child: RaisedButton(
            onPressed: () {
              MethodChannel('two_page').invokeMapMethod('popTo');
            },
            child: Text('頁(yè)面$pageIndex'),
          ),
        ),
      );
    }
    return null;
  }
}
  1. 在原生的oc頁(yè)面中排霉,有2個(gè)按鈕,點(diǎn)擊按鈕present到不同flutter頁(yè)面民轴。showCode:
#import "ViewController.h"
#import <Flutter/Flutter.h>

@interface ViewController ()
@property(nonatomic,strong)FlutterEngine* myEngine;
@property(nonatomic,strong)FlutterViewController* flutterVC;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"首頁(yè)";
    self.flutterVC = [[FlutterViewController alloc]initWithEngine:self.myEngine nibName:nil bundle:nil];
    self.flutterVC.modalPresentationStyle = 0;
}

-(FlutterEngine *)myEngine{
    if (!_myEngine) {
        FlutterEngine* flutterEngine = [[FlutterEngine alloc]initWithName:@"IPBao"];
        if (flutterEngine.run) {
            _myEngine = flutterEngine;
        }
    }
    return _myEngine;
}

- (IBAction)pushToFlutterVC:(UIButton *)sender {
    FlutterMethodChannel* channel = [FlutterMethodChannel methodChannelWithName:@"one_page" binaryMessenger:self.flutterVC];
    [channel invokeMethod:@"initParms" arguments:@{@"pageName":@"one"}];  // 這里執(zhí)行攻柠,會(huì)調(diào)用flutter里面的methodchannel球订。
    
    [channel setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult  _Nonnull result) {
        if ([call.method isEqualToString:@"popTo"]) {
            [self.flutterVC dismissViewControllerAnimated:YES completion:nil];
        }
    }];
    [self presentViewController:self.flutterVC animated:YES completion:nil];
}
- (IBAction)pushToFlutterVC2:(UIButton *)sender {
    FlutterMethodChannel* channel = [FlutterMethodChannel methodChannelWithName:@"two_page" binaryMessenger:self.flutterVC];
    [channel invokeMethod:@"initParms" arguments:@{@"pageName":@"two"}];  // 這里執(zhí)行,會(huì)調(diào)用flutter里面的methodchannel瑰钮。
    __weak typeof(self) weakSelf = self;
    [channel setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult  _Nonnull result) {
        if ([call.method isEqualToString:@"popTo"]) {
            [weakSelf.flutterVC dismissViewControllerAnimated:YES completion:nil];
        }
    }];
    [self presentViewController:self.flutterVC animated:YES completion:nil];
}
@end

效果圖.gif

最后冒滩,安利一個(gè)阿里的flutter框架https://github.com/alibaba/flutter_boost,直接用它不香么@饲础?!

flutter_boost.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苟耻,一起剝皮案震驚了整個(gè)濱河市篇恒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凶杖,老刑警劉巖胁艰,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異智蝠,居然都是意外死亡腾么,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門寻咒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哮翘,“玉大人颈嚼,你說(shuō)我怎么就攤上這事毛秘。” “怎么了阻课?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵叫挟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我限煞,道長(zhǎng)抹恳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任署驻,我火速辦了婚禮奋献,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旺上。我一直安慰自己瓶蚂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布宣吱。 她就那樣靜靜地躺著窃这,像睡著了一般。 火紅的嫁衣襯著肌膚如雪征候。 梳的紋絲不亂的頭發(fā)上杭攻,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天祟敛,我揣著相機(jī)與錄音,去河邊找鬼兆解。 笑死馆铁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痪宰。 我是一名探鬼主播叼架,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼衣撬!你這毒婦竟也來(lái)了乖订?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤具练,失蹤者是張志新(化名)和其女友劉穎乍构,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扛点,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哥遮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陵究。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眠饮。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖铜邮,靈堂內(nèi)的尸體忽然破棺而出仪召,到底是詐尸還是另有隱情,我是刑警寧澤松蒜,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布扔茅,位于F島的核電站,受9級(jí)特大地震影響秸苗,放射性物質(zhì)發(fā)生泄漏召娜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一惊楼、第九天 我趴在偏房一處隱蔽的房頂上張望玖瘸。 院中可真熱鬧,春花似錦檀咙、人聲如沸雅倒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屯断。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間殖演,已是汗流浹背氧秘。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趴久,地道東北人丸相。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像彼棍,于是被迫代替她去往敵國(guó)和親灭忠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355