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

Flutter如何存储每5秒变化的变量并实时读取更新后的值

问题排查与解决方案

现有代码问题定位

  • 读取逻辑仅执行一次:_getProbaFromSharedPref 仅在 Page 组件的 initState 生命周期中调用,该生命周期仅在页面首次初始化时触发一次,后续变量更新不会自动触发重读,所以拿到的永远是初始值
  • 存储异常排查:首先确认 predict 函数是否按预期每5秒触发,其次 setDouble 方法会返回布尔值表示存储是否成功,可添加日志验证存储结果

实现方案

方案1:全局状态管理(推荐,性能最优)

高频更新的变量无需每次都从磁盘IO读写,可将值存在内存中同步更新,持久化仅用作进程重启后的恢复:

  1. 实现全局单例管理变量
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();
  }
}
  1. APP启动时初始化单例
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await GlobalConfig().init();
  runApp(const MyApp());
}
  1. 替换原有存储逻辑,predict 函数中更新变量时调用:
Proba= double.parse(_list[1]);
await GlobalConfig().updateProba(Proba);
  1. 页面中监听变量变化自动更新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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:36:05