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
相关产品推荐
相关产品推荐

