Flutter应用中能否嵌入Flutter Engine运行另一个Flutter应用?
在Flutter macOS应用内嵌入独立Flutter Engine的实现方案
完全可以实现该需求,本质是通过主Flutter应用的原生宿主层新增独立的Flutter Engine实例,再通过PlatformView桥接挂载到主Flutter的Widget树中,具体实现步骤如下:
1. 原生层初始化独立Flutter Engine实例
你的Flutter macOS应用本身依托于macOS原生Runner工程运行,所有的Engine管理逻辑都可以在原生层直接操作:
- 打开项目
macos/目录下的Xcode工程,在合适的作用域(如AppDelegate、自定义工具类)声明非局部的FlutterEngine实例,避免实例被系统回收导致渲染崩溃 - 初始化时可单独指定该Engine的运行模式,要实现JIT动态加载子Flutter应用的需求,需要将JIT模式的Flutter.framework、子应用的
kernel_blob.bin、资源包一并打包进主应用包体,或运行时下载到沙盒后传入Engine
代码示例(Swift):
import FlutterMacOS // 声明为全局或类成员变量,不可为局部变量 private var subEngine: FlutterEngine? func initSubFlutterEngine() { subEngine = FlutterEngine(name: "dynamic_flutter_instance", project: nil, allowHeadless: false) // 可自定义传入子应用的入口方法、kernel文件路径、资源路径 subEngine?.run(withEntrypoint: "main", libraryURI: nil, initialRoute: "/") }
2. 通过PlatformView桥接子Engine渲染内容到主Flutter Widget树
要在主应用的Flutter页面展示子Engine的渲染结果,需要通过PlatformView做原生视图和Flutter Widget的桥接:
- 原生层实现
FlutterPlatformViewFactory协议,返回子Engine对应的FlutterViewController.view作为PlatformView的渲染载体,注册唯一的视图类型ID - 主Flutter应用侧使用
MacOSView组件,指定对应的视图类型ID,即可将子Engine的渲染内容嵌入到Widget树的任意位置
代码示例(Dart):
Widget buildSubFlutterView() { return const SizedBox( width: 400, height: 600, // viewType和原生层注册的类型ID保持一致 child: MacOSView(viewType: "com.your.domain/sub_flutter_view"), ); }
3. 双Engine通信配置
如果需要主应用和子Flutter应用之间交互,可分别在两个Engine上创建同名的MethodChannel,通过原生层作为中间件转发两端的方法调用与消息即可。
注意事项
- 主应用AOT编译发布不影响子Engine的JIT运行,只需确保两个Engine使用的Flutter SDK版本完全一致,避免出现符号冲突或兼容性问题
- 多Engine实例会带来额外的内存开销,单个Flutter Engine通常会额外占用30~80MB内存,可根据业务场景评估使用
- 采用JIT模式加载动态代码的应用无法通过苹果App Store审核,仅适合企业内部分发、个人使用等场景
内容的提问来源于stack exchange,提问作者Gabriel Gatu
相关产品推荐
相关产品推荐

