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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:06:48