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都写磁盘,避免不必要的性能开销:
推荐的保存触发节点:
- 用户手动点击暂停/停止秒表按钮时,立刻保存当前累计时长
- 应用切到后台、被系统回收前,通过
WidgetsBindingObserver监听应用生命周期状态,在暂停状态触发一次保存 - 秒表运行过程中可以加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
相关产品推荐
相关产品推荐

