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

Flutter中SharedPreferences无法正确取值(始终返回null)求助

问题分析与修复方案

你的代码存在几个关键问题导致SharedPreferences读取值为null,以下是具体问题和修复步骤:

核心问题

  1. 错误使用ListView.builder:用列表构建器来执行保存逻辑完全不合理,ListView.builder的作用是生成列表UI组件,而非处理数据持久化,这会导致保存逻辑执行时机不可控甚至不执行。
  2. 异步时序问题:initState中先调用getIdOrder(),此时API请求尚未完成、值还未存入SharedPreferences,所以第一次读取返回null是正常的,但后续读取异常是因为保存逻辑的位置错误。
  3. 异步调用未正确处理:调用异步方法时未等待操作完成,导致代码执行顺序不符合预期。

修复后的代码

1. 修正API数据获取与保存逻辑

移除错误的ListView.builder,直接在API请求完成后处理保存:

List<LastOrder>? lastOrders;
var isLoaded3 = false;
int od_id = 0;

getLastOrderMethod() async {
  lastOrders = await RemoteService().getLastOrder(2);
  // 增加非空与非空列表判断,避免索引越界
  if (lastOrders != null && lastOrders!.isNotEmpty) {
    setState(() {
      isLoaded = true;
      od_id = lastOrders![0].id;
      print('getLastOrderMethod: $od_id');
    });
    // 等待保存操作完成
    await saveIdOrder(od_id);
    // 保存完成后验证读取结果
    final savedId = await getIdOrder();
    print('保存后读取的order_id: $savedId');
  }
}

2. 优化SharedPreferences保存方法

明确参数类型,避免变量混淆:

Future<bool> saveIdOrder(int value) async {
  SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
  print('save: $value');
  return await sharedPreferences.setInt('order_id', value);
}

3. 优化SharedPreferences读取方法

指定返回类型,移除不必要的static修饰(除非你需要跨实例调用):

Future<int?> getIdOrder() async {
  SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
  final x = sharedPreferences.getInt('order_id');
  print('get: $x');
  return x;
}

4. 修正initState中的异步调用时序

确保先读取已保存值,再执行API请求并验证保存结果:

@override
void initState() {
  super.initState();
  print('initial ${od_id}');
  
  // 读取已保存的历史值
  getIdOrder().then((id) {
    print('初始读取的order_id: $id');
  });
  
  // 执行API请求并处理保存
  getLastOrderMethod().then((_) {
    getIdOrder().then((id) {
      print('API保存后读取的order_id: $id');
    });
  });
}

关键注意事项

  • 永远不要用UI构建组件(如ListView.builder)处理数据逻辑,数据操作应直接在API请求完成后执行。
  • 异步操作必须通过await或.then()处理,确保操作顺序符合预期。
  • 增加空安全判断(如检查列表是否为空),避免出现索引越界或空指针异常。

内容的提问来源于stack exchange,提问作者Fedy Belaid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:40:32