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

Flutter跨文件获取SharedPreferences值失败问题求助

问题排查与修复方案

核心问题1:异步代码执行顺序错误

你在main.dart的initState里,SharedPreferences.getInstance()是异步操作,它的then回调会在未来某个时间执行,但你紧接着同步调用了log('form submitted: $formSubmitted')——这时候formSubmitted还没被异步回调更新,所以始终打印初始值false。

核心问题2:表单页面的_prefs初始化存在异步风险

表单页面的_prefs是通过then异步赋值的,如果用户在_prefs还没初始化完成就点击提交按钮,会触发空指针异常,同时也可能导致值没成功写入。


修复步骤

1. 修正main.dart的异步逻辑

把异步逻辑抽成单独的async方法,确保在获取到SharedPreferences值后再打印和使用:

SharedPreferences? _prefs;
bool formSubmitted = false;

@override
void initState() {
  super.initState();
  _loadFormStatus();
}

void _loadFormStatus() async {
  final prefs = await SharedPreferences.getInstance();
  setState(() {
    formSubmitted = prefs.getBool('form_submitted') ?? false;
  });
  log('form submitted: $formSubmitted'); // 现在能拿到正确的存储值
}

2. 优化表单页面的_prefs初始化与提交逻辑

确保_prefs初始化完成后再允许提交,同时等待写入操作完成再跳转:

SharedPreferences? _prefs;

@override
void initState() {
  super.initState();
  _initPrefs();
}

// 异步初始化SharedPreferences
void _initPrefs() async {
  _prefs = await SharedPreferences.getInstance();
}

// 提交按钮点击逻辑
void _submitForm() async {
  if (_prefs == null) {
    // 处理初始化未完成的情况,比如提示用户稍等
    return;
  }
  // 等待值写入完成
  await _prefs!.setBool('form_submitted', true);
  // 跳转至下一页面
  Navigator.pushReplacement(context, MaterialPageRoute(builder: (ctx) => NextPage()));
}

3. 额外检查点

  • 确保iOS模拟器上的应用没有被卸载重装,否则SharedPreferences存储会被清空;
  • 测试时提交表单后,完全退出应用再重新打开,验证是否能正确读取标记值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:35:59