iOS原生APP集成Flutter模块:shared_preferences初始化报channel-error异常
解决方案
问题根源
- 在
ViewController中重复调用flutterEngine.run(),AppDelegate已完成引擎初始化与插件注册,重复执行会导致引擎内部状态混乱,平台通道无法正常建立。 - 新建的
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
相关产品推荐
相关产品推荐

