You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:27:16