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
相关产品推荐
相关产品推荐

