Flutter中SharedPreferences.getInt返回Future实例如何获取int值
问题根因
Dart中所有被async关键字修饰的函数,返回值会被自动包装为Future类型,无论函数内部return的是不是基础类型。直接同步调用这类函数不等待结果时,拿到的永远是Future实例,打印结果自然是Instance of Future<dynamic>。
你的现有代码还存在两个额外问题:
getMainColorInt()没有显式声明返回值类型,Dart自动将其推断为Future<dynamic>,丢失了int类型的静态检查- 类的静态变量是同步初始化的,无法直接接收异步函数的返回值做同步赋值,异步结果不会在同步初始化阶段返回
修复步骤
1. 补全异步函数的类型声明
给函数加上明确的返回类型,由于SharedPreferences.getInt()在key不存在时会返回null,因此返回类型为Future<int?>,同时去掉冗余的重复调用:
Future<int?> getMainColorInt() async { final prefs = await SharedPreferences.getInstance(); return prefs.getInt("mainColorInt"); }
2. 正确获取Future包装的实际值
Dart的异步模型基于单线程事件循环,无法在同步代码中直接取出Future内的值,必须通过标准异步方式获取:
在异步上下文中用await取值
在被async修饰的函数/方法内,使用await关键字等待Future执行完成,就能拿到实际的int值:
void doPrint() async { final int? storedColor = await getMainColorInt(); print(storedColor); // 此处打印的就是存储的实际int值,不会是Future实例 }
处理Palette类静态变量的赋值问题
静态变量的初始化是同步流程,无法直接在初始化时await异步结果,推荐用提前初始化的方案处理:
class Palette { static int? colorInt; // 编写统一的静态初始化方法 static Future<void> initConfig() async { // 未存储对应值时可以设置默认色,避免null异常 colorInt = await getMainColorInt() ?? 0xFF2196F3; } }
在App入口处优先执行初始化逻辑,确保后续使用变量时已经拿到值:
void main() async { // 初始化插件绑定,避免SharedPreferences调用报错 WidgetsFlutterBinding.ensureInitialized(); // 等待颜色配置加载完成 await Palette.initConfig(); runApp(const MyApp()); }
注意:不要尝试通过同步阻塞的方式"强拆"Future取值,会直接卡住UI线程,完全不符合Dart的异步设计逻辑。
内容的提问来源于stack exchange,提问作者Lear
相关产品推荐
相关产品推荐

