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

Flutter中SharedPreferences使用问题:星星计数无法持久化

问题分析与修复方案

核心问题

  1. updateStarsNumber方法逻辑错误:计算出新的星星总数后,错误地将0存入SharedPreferences,而非计算好的starsNumber。
  2. 未触发星星数更新:游戏结束(完成3次猜测)时,没有调用updateStarsNumber来保存本次获得的星星。
  3. ProfilePage默认值缺失:读取不到星星数时未设置默认值,导致显示异常。
  4. 代码结构错误: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代码
}

验证修复

  1. 完成3次猜测后,检查SharedPreferences是否正确保存星星总数。
  2. 重启应用,进入ProfilePage确认星星数正常显示。
  3. 多轮游戏后,验证星星数是否正确累加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:09:30