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

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重新拉取项目依赖
  • 卸载设备上的旧应用后重新安装
    以上操作执行后问题仍然存在。
故障原因

该异常是两个核心问题导致的:

  1. 没有初始化Flutter引擎与原生端的绑定:shared_preferences是依赖平台通道实现原生存储通信的插件,在main函数中直接调用插件方法前,没有先执行WidgetsFlutterBinding.ensureInitialized()完成绑定初始化,会导致Flutter无法和原生端建立通信链路,调用存储方法时找不到原生实现,直接抛出No Implementation Found错误。
  2. 代码执行顺序错误:在存储模块未完成初始化时就先执行了runApp启动应用,初始化过程的异常会直接进入未捕获异常区,同时如果后续读取值时没有设置默认值,目标key从未写入过存储时也会触发类型或空值异常。
修复方案
  1. 在main函数的最开头,所有插件调用、异步操作之前,添加绑定初始化代码WidgetsFlutterBinding.ensureInitialized();,该步骤必须放在所有插件相关逻辑之前
  2. 调整代码执行顺序:先完成存储模块的初始化,再执行应用启动逻辑
  3. 读取存储值时传入对应类型的默认值,避免目标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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:30:54