iOS和Flutter混合开发
本文最后更新于:2 年前
参考官方文档:
https://flutter.cn/docs/development/add-to-app
https://flutter.dev/docs/development/add-to-app/
一、创建并集成
- 使用命令行为原生工程创建
flutter模块
1 | |
- 使用
CocoaPods集成源码
1 | |
- 使用命令行打包成
framework集成
1 | |
命令行中加入--cocoapods参数会输出Flutter.podspec替代Flutter.framework,该podspec中为官方提供的Flutter.framework的集成地址,方便用户集成
二、iOS和Flutter混合开发交互方案
1、路由管理
- 官方方法
FlutterEngine是官方提供的管理类,推荐在App启动时初始化,由于该类占用内存较多,所以推荐只创建一次,每个Flutter页面都使用同一个FlutterEngine初始化
FlutterViewController是官方提供的控制器,集成UIViewController,推荐使用如下方法初始化
1 | |
注:官方文档中的隐式
FlutterEngine创建FlutterViewController的方法会产生新的FlutterEngine,不推荐使用
使用推荐方法创建的FlutterViewController默认加载的Flutter端main.dart中的main()方法,所以会直接展示对应绑定的页面
针对如上流程,当原生打开指定的Flutter页面时,初始化FlutterViewController后,使用pushRoute方法定位到对应的页面
1 | |
注:
pushRoute方法定位页面后,main.dart中的main()方法绑定的初始页面依然存在,所以在需要退出Flutter页面时,直接从原生关闭
相连多个Flutter页面之间建议仍然使用同一个controller,减少内存占用,便于整体状态(例如:黑暗模式等)维护
- 第三方插件
flutter_boost
flutter_boost是咸鱼团队开发的针对flutter混合开发的插件,能像原生一样直接打开相应的flutter页面,并且集成了对原生App前后台状态的监听和原生控制器的生命周期的监听,功能较为完善,混合开发推荐使用
1 | |
2、FlutterMethodChannel通信
FlutterMethodChannel是官方提供的原生和Flutter通信的工具,支持双向通信,通过该实例对象,触发方法,推荐使用单例持久化
通过FlutterMethodChannel可以实现对原生容器的修改,包括打开原生页面等
1 | |
三、flutter_boost参考代码
详细内容见github项目源码