Flutter调用SharePreferenceCache.getValue报未处理异常如何解决
问题描述
调用存储类从指定键读取对应值时,运行抛出异常,错误日志如下:
Restarted application in 2,783ms E/flutter (15641): [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: Exception: No Implementation Found E/flutter (15641): #0 SharePreferenceCache.getValue E/flutter (15641): #1 Settings.getValue E/flutter (15641): #2 main E/flutter (15641): <asynchronous suspension>
对应业务代码
main入口的实现代码如下:
Future<void> main() async { runApp(const MyApp()); await Settings.init( cacheProvider: SharePreferenceCache(), ); String iskeyValue = Settings.getValue<String>( keyValue, ); }
已尝试的排查操作:
- 执行
flutter clean清理项目构建缓存 - 执行
flutter pub get重新拉取项目依赖 - 卸载设备上的旧应用后重新安装
以上操作执行后问题仍然存在。
故障原因
该异常是两个核心问题导致的:
- 没有初始化Flutter引擎与原生端的绑定:
shared_preferences是依赖平台通道实现原生存储通信的插件,在main函数中直接调用插件方法前,没有先执行WidgetsFlutterBinding.ensureInitialized()完成绑定初始化,会导致Flutter无法和原生端建立通信链路,调用存储方法时找不到原生实现,直接抛出No Implementation Found错误。 - 代码执行顺序错误:在存储模块未完成初始化时就先执行了
runApp启动应用,初始化过程的异常会直接进入未捕获异常区,同时如果后续读取值时没有设置默认值,目标key从未写入过存储时也会触发类型或空值异常。
修复方案
- 在main函数的最开头,所有插件调用、异步操作之前,添加绑定初始化代码
WidgetsFlutterBinding.ensureInitialized();,该步骤必须放在所有插件相关逻辑之前 - 调整代码执行顺序:先完成存储模块的初始化,再执行应用启动逻辑
- 读取存储值时传入对应类型的默认值,避免目标key不存在时触发异常
修复后的正确代码示例:
Future<void> main() async { // 初始化Flutter与原生的通信绑定 WidgetsFlutterBinding.ensureInitialized(); // 先完成存储模块初始化 await Settings.init( cacheProvider: SharePreferenceCache(), ); // 读取值时传入默认值,兼容key未写入的场景 String iskeyValue = Settings.getValue<String>(keyValue, defaultValue: ""); // 所有初始化完成后启动应用 runApp(const MyApp()); }
如果按以上步骤修改后仍然报错,可以补充排查两点:
- 检查
pubspec.yaml中shared_preferences依赖版本和所用Settings封装库的版本是否兼容,不要跨大版本混用依赖 - 确认存储读写操作都是在主Isolate中执行,平台通道不支持在后台Isolate中调用
内容的提问来源于stack exchange,提问作者user19400370
相关产品推荐
相关产品推荐

