Flutter中SharedPreferences使用问题:星星计数无法持久化
问题分析与修复方案
核心问题
updateStarsNumber方法逻辑错误:计算出新的星星总数后,错误地将0存入SharedPreferences,而非计算好的starsNumber。- 未触发星星数更新:游戏结束(完成3次猜测)时,没有调用
updateStarsNumber来保存本次获得的星星。 - ProfilePage默认值缺失:读取不到星星数时未设置默认值,导致显示异常。
- 代码结构错误:
dispose方法嵌套在buildGame内,不符合Flutter State类规范。
修复步骤
1. 修正updateStarsNumber方法
将保存的数值从0改为计算后的starsNumber:
Future<void> updateStarsNumber() async{ final SharedPreferences pref = await SharedPreferences.getInstance(); int oldStarsNumber = await getOldStarsNumber(); int starsNumber = correctGuesses + oldStarsNumber; pref.setInt('keyStarsNumber', starsNumber); // 修正此处,存入正确数值 }
2. 在游戏结束时调用更新方法
当counter == 3时,先调用updateStarsNumber保存星星数,再显示弹窗:
if (counter == 3) { await updateStarsNumber(); // 等待保存完成 // 后续弹窗逻辑保持不变 if (correctGuesses == 0) { // ...弹窗代码 } // ...其他弹窗分支 }
3. 重置correctGuesses
每次游戏结束后重置该变量,避免下一轮累加错误:
if (counter == 3) { await updateStarsNumber(); correctGuesses = 0; // 重置为0,准备下一轮游戏 // ...弹窗逻辑 }
4. 修正ProfilePage的默认值
读取星星数时添加默认值,防止无数据时显示异常:
Future<void> setStarsNumber() async { final SharedPreferences pref = await SharedPreferences.getInstance(); starsNumber = pref.getInt('keyStarsNumber') ?? 0; // 添加默认值0 setState(() {}); }
5. 修正代码结构错误
将dispose方法移到State类顶层,并把myController提升为成员变量:
// State类成员变量 late final TextEditingController myController; @override void initState() { super.initState(); myController = TextEditingController(); } @override void dispose() { myController.dispose(); super.dispose(); } Widget buildGame() { // 移除内部的myController定义和dispose方法 // ...剩余buildGame代码 }
验证修复
- 完成3次猜测后,检查SharedPreferences是否正确保存星星总数。
- 重启应用,进入ProfilePage确认星星数正常显示。
- 多轮游戏后,验证星星数是否正确累加。
内容的提问来源于stack exchange,提问作者Cornel
相关产品推荐
相关产品推荐

