Flutter与Xcode那些事

Hi, 各位看官, 里边请! 😁
最近在搞Flutter, 来跟各位随便唠唠! 今天我们不说语法, 也不说 widget 哈! 有兴趣的小伙伴可以点击链接去查看Flutter相关内容!

今天跟看官们说说, Flutter 与 iOS交互的那些事! 由于我的本没有安装 Android Studio, 则用VS Code来说, 本期主要围绕着 Xcode 来讲!
关于安卓其结构都一样, 后期会推出!

在iOS 原有的项目中集成Flutter

原有的项目我就不做展示了哈, 我用一个Demo 来演示! 其效果是一样

  • 首先打开终端, 输入 flutter create --template module my_flutter, 创建 module, 命名为my_flutter

    然后打开module, ( Tip: 在集成进 Xcode之前, model 最好先运行起来)

  • 我相信身为iOS开发者对CocoaPods都不陌生吧, 本期将通过CocoaPods管理, 把刚刚创建的 Flutter module 集成到项目中

1.打开 Podfile 文件, 在其中添加 module 本地路径:

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

# 添加模块所在路径
flutter_application_path = '../my_flutter'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')


target 'useFlutter' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!
  # 安装Flutter模块
  install_all_flutter_pods(flutter_application_path)

end
  1. 添加完成后,保存退出! 然后 pod install

3.打开Xcode项目, 在AppDelegate中创建引擎

class AppDelegate: UIResponder, UIApplicationDelegate {

    // 1. 创建 flutterEngine  name: 引擎名称
    lazy var flutterEngine = FlutterEngine(name: "Evan_Engine")

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        // 2.启动引擎
        flutterEngine.run()
        
        return true
    }
}

4.来到 ViewController中来使用 Flutter module

// 该函数为Button点击事件
@IBAction func flutterPush(_ sender: Any) {
        // 3. 创建FlutterViewController对象(需要先获取flutterEngine)
        let flutterEngine = (UIApplication.shared.delegate as! AppDelegate).flutterEngine;
        let flutterViewController = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil);
        flutterViewController.modalPresentationStyle = .fullScreen
        self.present(flutterViewController, animated: true, completion: nil)
  }

我们也可以省略预先创建的 FlutterEngine :
但不推荐这样来做,因为在第一针图像渲染完成之前,可能会出现明显的延迟。

@IBAction func flutterPush(_ sender: Any) {
  let flutterViewController = FlutterViewController(project: nil, nibName: nil, bundle: nil)
  present(flutterViewController, animated: true, completion: nil)
}
  1. 把项目运行起来, 点击Button, 来看看效果


哈哈, 是不是感觉好简单!

Tip: 不要把 widget 作为 view 来与原生的同一个页面上混用, 可能会有不可预知行为! 切记切记

  • 虽说是用Xcode在运行, 但我们还是可以继续来使用 Hot Reload


  1. 打开 module, 在终端执行 flutter attach, 链接成功后, 如下图


2.此时我们就可以去修改代码, 将 Text 字体颜色改为red, 修改完后先保存, 然后在VS Code 终端中输入 r, 则执行了Hot reload, 此时屏幕也随之发生了改变, 大功告成! 😁


注意: 目前一些场景依然是有限制的:
  • 运行多个Flutter实例,或在屏幕局部上运行Flutter可能会导致不可以预测的行为;
  • 在后台模式使用Flutter的能力还在开发中(目前不支持);
  • 将Flutter库打包到另一个可共享的库或将多个Flutter库打包到同一个应用中,都不支持;
  • 添加到应用在Android平台的实现基于 FlutterPlugin 的 API,一些不支持FlutterPlugin 的插件可能会有不可预知的行为。
Flutter 与 iOS 交互
  • 打开Flutter 项目, 创建 StatefulWidget,
    1. 创建通信对象 MethodChannel
    2. 调用原生的函数 getOriginalContent
class MyInteractionBody extends StatefulWidget {
  @override
  _MyInteractionBodyState createState() => _MyInteractionBodyState();
}

class _MyInteractionBodyState extends State<MyInteractionBody> {

// 1.创建通信对象  MethodChannel 
static const platForm = MethodChannel('Evan_channel');

  var _content = '文案';

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
      Text(_content),
      SizedBox(height: 10,),
      TextButton(
      child: Text('调用原生函数'), 
      onPressed: getContent)
    ],
    ),
    );
  }

  void getContent() async {
    // 2. 调用原生的函数 getOriginalContent, 等待回调
    final result = await platForm.invokeMethod('getOriginalContent');
    setState(() {
      _content = result;
    });
  }
}

  1. 使用Xcode打开Flutter 中 ios文件中的项目, 在需要处添加以下代码
// 1.获取 FlutterViewController
    if let controller: FlutterViewController = window.rootViewController as? FlutterViewController {
        
        // 2. FlutterMethodChannel
        let channel = FlutterMethodChannel(name: "Evan_channel", binaryMessenger: controller.binaryMessenger)
        
        // 3.监听 channel 调用方法
        channel.setMethodCallHandler { (call: FlutterMethodCall, result:  @escaping FlutterResult) in
            // 函数名称
            if call.method == "getOriginalContent" {

                // 如果没有获取到,那么返回给Flutter端一个异常
                // result(FlutterError(code: "0", message: "错误", details: nil))
            
                // 通过result将结果回调给Flutter端
                result(self.getOriginalContent())
            } else {
                // 未找到
               result(FlutterMethodNotImplemented)
            }
        }
    }

func getOriginalContent() -> String { "已经与原生成功交互" }

到此交互就可以使用了!

好了, Flutter 与 Xcode 交互这点事, 大体上也都跟各位看官唠完了, 以上只是一些基本简单用法, 更多的技能还需要用各位去探索, 研究哦!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,002评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,777评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,341评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,085评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,110评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,868评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,528评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,422评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,938评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,067评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,199评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,877评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,540评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,079评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,192评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,514评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,190评论 2 357

推荐阅读更多精彩内容