Flutter中如何用Shared Preferences保存数据库布尔值(第二部分)
问题描述
我在Flutter应用中修改Firebase实时数据库People节点下的布尔值Joined后,尝试用SharedPreferences将该值本地保存。目前重启APP时能成功读取到保存的true值,但UI未同步更新——通过People['Joined'] ? Colors.green : Colors.blue控制的组件颜色仍为蓝色,原因是本地读取的joined变量未同步赋值给People['Joined']。
修复方案
1. 同步本地数据到People对象并触发UI刷新
修改_loadData方法,在读取到本地保存的值后,直接更新People['Joined']并调用setState触发UI重建:
_loadData() async { bool joined = prefs.getBool("People['Joined']") ?? false; print('loadData :$joined'); // 将本地值同步到People对象,并触发UI刷新 setState(() { People['Joined'] = joined; }); }
2. 统一SharedPreferences键名(可选优化)
当前使用的键名"People['Joined']"存在转义字符,建议简化为更简洁的命名,避免潜在问题:
// 保存时 await prefs.setBool("people_joined", People['Joined']); // 读取时 bool joined = prefs.getBool("people_joined") ?? false;
3. 优化异步方法调用时机
原代码在setState内部调用异步方法savebool,可能导致状态更新混乱,建议将异步操作移到setState外部:
onPressed: (BuildContext context) { setState(() { People['Joined'] = true; }); savebool(); // 异步操作移到setState外 print('saved'); }
4. 移除重复的savebool方法
listItem组件内重复定义了savebool方法,且固定保存true,会导致后续修改值无法正常保存,建议删除该重复方法,统一使用外部的savebool逻辑。
内容的提问来源于stack exchange,提问作者Tyrone
相关产品推荐
相关产品推荐

