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

iOS原生APP集成Flutter模块:shared_preferences初始化报channel-error异常

解决方案

问题根源

  1. 在ViewController中重复调用flutterEngine.run(),AppDelegate已完成引擎初始化与插件注册,重复执行会导致引擎内部状态混乱,平台通道无法正常建立。
  2. 新建的FlutterViewController未关联已初始化的引擎实例,导致其使用未注册插件的新引擎,调用SharedPreferences时触发通道错误。

修改步骤

1. 修正ViewController.swift的goToFlutterPage方法

移除重复的引擎启动调用,改用已初始化的引擎创建Flutter视图控制器:

@IBAction func goToFlutterPage(_ sender: Any) {
    api.syncDataToFlutter(user: user) {
        // 关联已初始化的引擎实例
        let flutterViewController = FlutterViewController(engine: self.flutterEngine, nibName: nil, bundle: nil)
        self.present(flutterViewController, animated: true, completion: nil)
    }
}

2. 简化API初始化逻辑

无需在goToFlutterPage中重复初始化API,保留viewDidLoad中的单次初始化即可:

let flutterEngine = (UIApplication.shared.delegate as! AppDelegate).flutterEngine
var api: NativeDataSaveToFlutterAPI!

override func viewDidLoad() {
    super.viewDidLoad()
    // 仅初始化一次API
    api = NativeDataSaveToFlutterAPI(binaryMessenger: flutterEngine.binaryMessenger)
}

原理说明

  • AppDelegate中预初始化的flutterEngine已通过GeneratedPluginRegistrant完成所有插件(包括shared_preferences)的注册,复用该实例可保证平台通道连接正常。
  • 使用FlutterViewController(engine: ...)构造方法,会直接关联已有引擎,而非创建新实例,确保Flutter代码调用SharedPreferences.getInstance()时能找到正确的平台通道。

额外检查项

  • 确认pubspec.yaml中shared_preferences版本与Flutter 3.7.8稳定版兼容(推荐使用2.2.x系列版本)。
  • 清理iOS项目的Derived Data后重新编译,避免缓存引发的异常。

内容的提问来源于stack exchange,提问作者Lee Chun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:43:17