前沿

由于我司已经有自己的App,flutter属于技术引进的一部分,也不太可能重新启动一个项目,因此目前我们是将flutter模块形式注入我们的App之中。即:将flutter模块集成到现在有iOS工程之中。

目录

  1. 创建flutter模块工程
  2. 使用pod 将flutter 模块工程添加到现有工程之中
  3. code 执行flutter 工程
  4. 运行热更新

1. 创建flutter模块工程

我这里是使用Android Studio 创建flutter工程,如下:

当然也可以使用flutter命令行进行创建,命令如下:

$ cd some/path/
$ flutter create -t module my_flutter
工程结构 和我们的iOS 工程保持相对目录,结构如下:
some/path/
my_flutter/
lib/main.dart
.ios/
MyApp/
MyApp/
AppDelegate.h
AppDelegate.m (or swift)
:

2. 使用pod 将flutter 模块工程添加到现有工程之中

2.1 podfile 文件之中引入 flutter模块工程

####Flutter###
flutter_application_path = '../my_flutter' //目录结构按照具体我们存储的路径进行
eval(File.read(File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')), binding)

2.2 然后执行pod install

2.3 ENABLE_BITCODE  设置为NO

2.4 Build Phares 添加 以下脚本(+ 号添加一个新的脚本,然后复制下面的内容)

"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed

执行编译即可

 最新版本集成 (最新版本已经优化了很多东西,不需要配置sh)

####Flutter###
flutter_application_path = 'somepath/flutter_rokid'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')

target 'App' do

install_all_flutter_pods(flutter_application_path)

....

end

3.code 执行flutter 工程

1. AppDelete.h 配置

import FlutterPluginRegistrant // Only if you have Flutter Plugins.

@UIApplicationMain

class AppDelegate: FlutterAppDelegate {
  ...

        self.flutterEngine = FlutterEngine(name: "xxx.flutter", project: nil);

self.flutterEngine?.run(withEntrypoint: nil);

GeneratedPluginRegistrant.register(with: self.flutterEngine);

   ...
}

2. 业务方调用

import Foundation
import Flutter class RKFlutterDemo : UIViewController {
override func viewDidLoad() {
title = "flutter "
var button = UIButton(type:UIButtonType.custom)
button.addTarget(self, action: #selector(handleButtonAction), for: .touchUpInside)
button.setTitle("Press me", for: UIControlState.normal)
button.frame = CGRect(x: 80.0, y: 210.0, width: 160.0, height: 40.0)
button.backgroundColor = UIColor.blue
self.view.addSubview(button) button = UIButton(type:UIButtonType.custom)
button.addTarget(self, action: #selector(handleButtonAction1), for: .touchUpInside)
button.setTitle("Press me v1", for: UIControlState.normal)
button.frame = CGRect(x: 80.0, y: 270.0, width: 160.0, height: 40.0)
button.backgroundColor = UIColor.blue
self.view.addSubview(button) button = UIButton(type:UIButtonType.custom)
button.addTarget(self, action: #selector(handleButtonAction2), for: .touchUpInside)
button.setTitle("Press me v2", for: UIControlState.normal)
button.frame = CGRect(x: 80.0, y: 330.0, width: 160.0, height: 40.0)
button.backgroundColor = UIColor.blue
self.view.addSubview(button) }

  //全局生命周期,即便是 VC 退出页面下次打开还是会 停留在上一次操作结果(所以适合全局性页面)
@objc func handleButtonAction() {
let flutterEngine = (UIApplication.shared.delegate as? AppDelegate)?.flutterEngine;
let flutterViewController = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil)!;
self.navigationController?.pushViewController(flutterViewController, animated: true)
}

//每次都会创建实例
@objc func handleButtonAction1(){
let flutterViewController = FlutterViewController();
self.navigationController?.pushViewController(flutterViewController, animated: true)
}

//如果一个模块有多个 页面导航,则需要设置路由进行跳转
@objc func handleButtonAction2(){
let flutterViewController = FlutterViewController();
flutterViewController.setInitialRoute("router1") //跳转到路由
self.navigationController?.pushViewController(flutterViewController, animated: true)
} }

4. 运行热更新

其实在我们App 集成完成之后,我们还是可以在flutter工程之中直接运行到我们自己的工程之中

4.1  使用Xcode运行我们的App  Command+R 运行

4.2 cd 到 在flutter 工程下 执行命令行:

flutter attach

这样我们直接编写 ,然后在 命令行中 按住 r 就可以 直接更新 App 中的页面了

备注:在3的打开方式之中 只能以下模式的页面可以更新

   @objc func handleButtonAction() {
let flutterEngine = (UIApplication.shared.delegate as? AppDelegate)?.flutterEngine;
let flutterViewController = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil)!;
self.navigationController?.pushViewController(flutterViewController, animated: true)
}

参考文献

https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps#experiment-turn-the-flutter-project-into-a-module

Flutter 集成到现有iOS工程的更多相关文章

  1. Cordova-在现有iOS工程自动化接入Cordova插件

    模拟Cordova插件命令 自己编写脚本,了解cordova添加插件做了哪些事情. 上一篇文章了解到,web与native的交互主要是cordova.js中的exec方法调用,触发交互事件.UIWeb ...

  2. Flutter-现有iOS工程引入Flutter

    前言 Flutter 是一个很有潜力的框架,但是目前使用Flutter的APP并不算很多,相关资料并不丰富,介绍现有工程引入Flutter的相关文章也比较少.项目从零开始,引入Flutter操作比较简 ...

  3. 升级添加到现有iOS Xcode项目的Flutter

    如果你在2019年8月之前将Flutter添加到现有iOS项目,本文值得你一看. 在2019年7月30日,合并合并请求flutter / flutter#36793之前Flutter 1.8.4-pr ...

  4. Flutter踩坑日记:接入现有iOS项目

    之前搞的Flutter版工具链已经弄完了,感兴趣的朋友可以围观下,Android版本dio库(v2.0.14)发送网络请求老是报错,去官方提了issue还没回,于是今天搞一下把Flutter模块接入到 ...

  5. 现有iOS项目集成React Native过程记录

    在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...

  6. react native 之 在现有的iOS工程中集成react native

    在现有的iOS工程中集成react native, 或者说将react native引入到iOS 项目,是RN和iOS混合开发的必经之路 参考官网教程:https://reactnative.cn/d ...

  7. Cordova与现有框架的结合,Cordova插件使用教程,Cordova自定义插件,框架集成Cordova,将Cordova集成到现有框架中

    一.框架集成cordova 将cordova集成到现有框架中 一般cordova工程是通过CMD命令来创建一个工程并添加Android.ios等平台,这样的创建方式可以完整的下载开发过程中所需要的的插 ...

  8. 将React Native 集成进现有OC项目中(过程记录) 、jsCodeLocation 生成方式总结

    将RN集成到现有OC项目应该是最常见的,特别是已经有OC项目的,不太可能会去专门搞个纯RN的项目.又因为RN不同版本,引用的依赖可能不尽相同,所以特别说明下,本文参考的文档是React Native ...

  9. 给iOS工程增加Daily Build

    给iOS工程增加Daily Build  前言 Daily Build 是一件非常有意义的事情,也是敏捷开发中关于 "持续集成" 的一个实践.Daily Build 对于开发来说有 ...

随机推荐

  1. 剑指offer——44连续子数组的最大和

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  2. 设置单网卡双ip

    环境如下: [root@localhost ~]# cat /etc/redhat-releaseCentOS Linux release 7.7.1908 (Core) 安装时选择的最小化安装 -- ...

  3. docker容器的常见操作

    进入容器 docker exec -it 12a022ee8127 /bin/bash 交互模式进入容器 docker exec -it 12a022ee8127 ip a 查看容器的ip等信息 批量 ...

  4. mysql shell脚本

    mysql shell连接脚本 本地连接及远程链接 #!/bin/bash #连接MySQL数据库 Host=127.0.0.1 User=username PASSWORD=password POR ...

  5. Spring事务详细解释

    前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为.事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为.这是Spring ...

  6. 关于阿里云 ETC服务器 端口开放问题

    今天整了个阿里云,为了开放一个端口 各种入出规则整了半天 最后连一个hello world都发不出来.. 最后的最后 才知道 开端口除了做入规则操作 还得调一下阿里的控制台 当你也买了个ECS不要像我 ...

  7. python学习9—文件基本操作与高级操作

    python学习9—文件基本操作与高级操作 1. 文件基本操作 打开文件,获得文件句柄:f = open('filename',encoding='utf-8'),open会查询操作系统的编码方式,并 ...

  8. Python中两大神器&exec() &eval()

    一.神器1 -- 内置函数eval eval是python中的内置函数,它的作用是将字符串变为所对应的表达式,也相当于一个功能代码加双引号变为字符串,而eval又将字符串转为相应的功能,它在使用过程中 ...

  9. 2018-2-13-win10-uwp-入门

    title author date CreateTime categories win10 uwp 入门 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23 ...

  10. windows版nginx+ftp实现图片服务器的搭建

    配置图片服务器的一部分参数 resource.properties: #FTP\u76f8\u5173\u914d\u7f6e #FTP\u7684ip\u5730\u5740 FTP_ADDRESS ...