Flutter如何存储每5秒变化的变量并实时读取更新后的值
问题排查与解决方案
现有代码问题定位
- 读取逻辑仅执行一次:
_getProbaFromSharedPref仅在Page组件的initState生命周期中调用,该生命周期仅在页面首次初始化时触发一次,后续变量更新不会自动触发重读,所以拿到的永远是初始值 - 存储异常排查:首先确认
predict函数是否按预期每5秒触发,其次setDouble方法会返回布尔值表示存储是否成功,可添加日志验证存储结果
实现方案
方案1:全局状态管理(推荐,性能最优)
高频更新的变量无需每次都从磁盘IO读写,可将值存在内存中同步更新,持久化仅用作进程重启后的恢复:
- 实现全局单例管理变量
import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter/foundation.dart'; class GlobalConfig extends ChangeNotifier { static final GlobalConfig _instance = GlobalConfig._internal(); factory GlobalConfig() => _instance; GlobalConfig._internal(); double proba = 0; // APP启动时初始化,从SharedPreferences读取历史值 Future<void> init() async { SharedPreferences sp = await SharedPreferences.getInstance(); proba = sp.getDouble('Proba') ?? 0; } // 更新变量时同步更新内存值和持久化存储 Future<void> updateProba(double newVal) async { proba = newVal; SharedPreferences sp = await SharedPreferences.getInstance(); await sp.setDouble('Proba', newVal); // 通知所有监听的页面自动更新UI notifyListeners(); } }
- APP启动时初始化单例
void main() async { WidgetsFlutterBinding.ensureInitialized(); await GlobalConfig().init(); runApp(const MyApp()); }
- 替换原有存储逻辑,
predict函数中更新变量时调用:
Proba= double.parse(_list[1]); await GlobalConfig().updateProba(Proba);
- 页面中监听变量变化自动更新UI,无需手动轮询:
@override void initState() { super.initState(); // 监听全局变量变化自动更新Value GlobalConfig().addListener(() { setState(() { Value = GlobalConfig().proba; }); }); }
方案2:定时读取SharedPreferences
如果必须每次从持久化存储读取最新值,可在页面中添加定时器定期重读:
Timer? _readTimer; @override void initState() { super.initState(); // 原有逻辑保留 _readTimer = Timer.periodic(const Duration(seconds: 5), (timer) async { final latestVal = await _getProbaFromSharedPref(); setState(() { Value = latestVal; }); }); } @override void dispose() { _readTimer?.cancel(); super.dispose(); }
存储失败排查
如果确认变量更新后还是存不上,可在存储位置添加日志验证:
final saveSuccess = await prefs.setDouble('Proba', Proba); debugPrint('存储Proba值:$Proba,结果:$saveSuccess');
如果返回false可排查存储的数值是否合法,同时建议全局只获取一次SharedPreferences实例,避免重复调用getInstance产生不必要的开销。
内容的提问来源于stack exchange,提问作者Asma Ben Nasr
相关产品推荐
相关产品推荐

