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

Flutter开发秒表应用:持久化存储duration实现断点续计时

Flutter秒表计时时长持久化实现方案

实现秒表退出后从上次停止位置续跑,用轻量键值存储即可完成,不需要引入重型数据库,具体实现步骤如下:

前置准备

  • 引入轻量本地存储依赖shared_preferences,在项目pubspec.yaml的dependencies区块添加依赖后执行flutter pub get即可:
dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.2.2

核心实现逻辑

  • 明确存储字段:只需要存一个整数字段last_elapsed_ms,记录上次退出时秒表已经累计的毫秒数即可,不要存浮点型的秒/分单位,避免浮点计算误差。如果需要支持「退出时秒表仍在运行、回到应用自动续跑」的效果,额外加一个布尔字段is_running记录退出时的运行状态即可。
  • 选择合适的保存触发时机,不要每帧刷新UI都写磁盘,避免不必要的性能开销:

    推荐的保存触发节点:

    1. 用户手动点击暂停/停止秒表按钮时,立刻保存当前累计时长
    2. 应用切到后台、被系统回收前,通过WidgetsBindingObserver监听应用生命周期状态,在暂停状态触发一次保存
    3. 秒表运行过程中可以加5秒间隔的自动保存,避免应用异常崩溃时进度丢失过多
  • 保存逻辑示例代码:
Future<void> _saveCurrentDuration(Duration currentDuration) async {
  final prefs = await SharedPreferences.getInstance();
  await prefs.setInt('last_elapsed_ms', currentDuration.inMilliseconds);
}
  • 应用启动时读取恢复:在应用启动首屏的initState生命周期,或者runApp之前(需要先调用WidgetsFlutterBinding.ensureInitialized()确保插件初始化完成)读取存储的毫秒数,转换为Duration作为秒表的初始值即可:
Future<Duration> _loadSavedDuration() async {
  final prefs = await SharedPreferences.getInstance();
  final savedMs = prefs.getInt('last_elapsed_ms') ?? 0;
  return Duration(milliseconds: savedMs);
}

// 初始化秒表状态示例
@override
void initState() {
  super.initState();
  _loadSavedDuration().then((savedDuration) {
    // 把savedDuration赋值给秒表状态的初始累计时长,后续计时从这个值开始累加
    elapsedDuration = savedDuration;
  });
}

注意事项

  • 如果后续需要扩展保存多组计时记录、分段计时数据,再替换成sqflite、Isar等本地数据库方案即可,单秒表续跑场景用shared_preferences性能开销最低,实现最简单
  • 存储的数据会在用户卸载应用、清空应用数据时自动清除,符合移动端系统的常规交互逻辑,不需要额外做清理逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 05:12:16