通过UniversalLink启动Flutter应用崩溃:Engine is required异常求助
解决通过UniversalLink冷启动Flutter应用时的'Engine is required'异常
问题场景
关闭应用后通过UniversalLink启动,打开特定FlutterViewController时抛出异常:
Flutter view controller抛出'NSInternalInconsistencyException',原因:'Engine is required'
已在AppDelegate中完成FlutterEngine初始化,代码如下:
override func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { self.flutterStart() return true } func flutterStart() { flutterEngine.run() // Connects plugins with iOS platform code to this app. GeneratedPluginRegistrant.register(with: self.flutterEngine); }
应用处于已打开状态时,所有功能运行正常。
解决方案
在创建FlutterViewController时,通过DispatchQueue.main.async调度到主队列执行,同时检查flutterStart()是否已执行(或引擎是否处于运行状态),未执行则立即调用:
示例代码
// 处理UniversalLink的方法中添加如下逻辑 func handleUniversalLink(_ url: URL) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } // 检查FlutterEngine是否已启动,未启动则执行初始化 if !self.flutterEngine.isRunning { self.flutterStart() } // 创建并展示FlutterViewController let flutterVC = FlutterViewController(engine: self.flutterEngine, nibName: nil, bundle: nil) // 根据业务需求调整页面跳转方式(present/push等) self.window?.rootViewController?.present(flutterVC, animated: true) } }
逻辑说明
冷启动时,UniversalLink的处理逻辑可能先于AppDelegate中的flutterStart()完成执行,导致创建FlutterViewController时引擎尚未初始化。通过主队列异步调度,能保证代码在引擎初始化流程完成后执行;同时增加引擎运行状态检查,确保初始化逻辑被正确触发,避免因时序问题导致的异常。
内容的提问来源于stack exchange,提问作者Vitor Campos
相关产品推荐
相关产品推荐

