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

Flutter/Swift混合iOS应用:认证后跳转Flutter时重复显示启动屏

解决iOS混合应用跳转Flutter页面时重复显示启动屏的问题

这个问题的根源是:直接初始化FlutterViewController时,Flutter引擎会默认显示UILaunchStoryboardName对应的启动屏,直到Dart代码完成首帧渲染。如果跳转阶段才初始化引擎,就会触发启动屏再次显示。以下是几种可行的解决方法:

方案1:提前预热FlutterEngine(推荐)

在应用启动阶段或认证流程中提前初始化Flutter引擎,跳转至Flutter页面时引擎已就绪,不会再触发启动屏。

步骤1:在AppDelegate中提前初始化引擎

import Flutter

class AppDelegate: UIResponder, UIApplicationDelegate {
    var flutterEngine: FlutterEngine!

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 初始化并运行Flutter引擎
        flutterEngine = FlutterEngine(name: "pre_warmed_engine")
        flutterEngine.run()
        // 注册插件
        GeneratedPluginRegistrant.register(with: flutterEngine)
        AppManager.shared.startFlutterManager(engine: flutterEngine)
        return true
    }
}

步骤2:修改CustomFlutterViewController,复用已有引擎

import Foundation
import Flutter
import FlutterPluginRegistrant

class CustomFlutterViewController: FlutterViewController {
    
    // 新增接收已有引擎的初始化方法
    init(engine: FlutterEngine) {
        super.init(engine: engine, nibName: nil, bundle: nil)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.isNavigationBarHidden = true
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.isNavigationBarHidden = false
    }
}

步骤3:跳转时使用预热好的引擎创建控制器

// 获取AppDelegate中提前初始化的引擎
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate,
      let engine = appDelegate.flutterEngine else { return }

let destinationVC = CustomFlutterViewController(engine: engine)
containedNavigationController.setViewControllers([destinationVC], animated: false)

方案2:直接禁用FlutterViewController的启动屏

如果不需要提前预热引擎,可以通过设置initializationViewController为nil,阻止Flutter显示默认启动屏。注意这种方式可能会在Flutter页面渲染前出现空白,建议配合自定义过渡视图。

修改CustomFlutterViewController的初始化方法:

override init(project: FlutterDartProject?, nibName: String?, bundle nibBundle: Bundle?) {
    super.init(project: project, nibName: nibName, bundle: nibBundle)
    // 禁用默认启动屏
    self.initializationViewController = nil
    
    if let engine = engine {
        GeneratedPluginRegistrant.register(with: engine)
        AppManager.shared.startFlutterManager(engine: engine)
    }
}

方案3:检查Info.plist配置

确认Info.plist中没有重复配置Flutter启动屏相关项:

  • 确保FlutterLaunchScreen未被设置为你的应用启动storyboard
  • 检查UILaunchStoryboardName仅在应用启动时生效,无其他地方重复触发

内容的提问来源于stack exchange,提问作者Ryan Heitner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:50:05