Flutter开发:实现计数器点击递增后每日自动重置为零的方法咨询
Flutter计数器每日自动重置实现方案
核心思路
通过持久化存储计数器值和上一次重置的日期,每次操作计数器或启动应用时,检查当前日期与存储的重置日期是否一致。若不一致,则将计数器重置为0并更新重置日期。
步骤1:添加持久化依赖
使用轻量级的shared_preferences存储数据,在pubspec.yaml中添加依赖:
dependencies: flutter: sdk: flutter shared_preferences: ^2.2.2
步骤2:封装计数器逻辑
创建工具类处理数据读写和重置判断:
import 'package:shared_preferences/shared_preferences.dart'; import 'package:intl/intl.dart'; class DailyCounter { static const String _counterKey = 'daily_counter'; static const String _lastResetDateKey = 'last_reset_date'; // 获取当前计数器值,自动检查是否需要重置 static Future<int> getCounter() async { final prefs = await SharedPreferences.getInstance(); final lastResetDate = prefs.getString(_lastResetDateKey); final currentDate = DateFormat('yyyy-MM-dd').format(DateTime.now()); // 日期不一致时重置计数器 if (lastResetDate != currentDate) { await prefs.setInt(_counterKey, 0); await prefs.setString(_lastResetDateKey, currentDate); return 0; } return prefs.getInt(_counterKey) ?? 0; } // 计数器加1(先检查重置) static Future<int> incrementCounter() async { int currentCount = await getCounter(); currentCount++; final prefs = await SharedPreferences.getInstance(); await prefs.setInt(_counterKey, currentCount); return currentCount; } }
步骤3:在Widget中集成
将逻辑与UI结合,实现点击计数和自动重置:
import 'package:flutter/material.dart'; class CounterPage extends StatefulWidget { const CounterPage({super.key}); @override State<CounterPage> createState() => _CounterPageState(); } class _CounterPageState extends State<CounterPage> { int _counter = 0; @override void initState() { super.initState(); _loadCounter(); } // 加载初始计数器值 Future<void> _loadCounter() async { final count = await DailyCounter.getCounter(); setState(() => _counter = count); } // 处理点击加1 Future<void> _increment() async { final count = await DailyCounter.incrementCounter(); setState(() => _counter = count); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('每日计数器')), body: Center( child: Text( '今日点击次数:$_counter', style: const TextStyle(fontSize: 24), ), ), floatingActionButton: FloatingActionButton( onPressed: _increment, child: const Icon(Icons.add), ), ); } }
补充说明
- 用
yyyy-MM-dd格式判断日期,确保只按自然日重置,不受具体时间影响。 - 如果需要精确到凌晨0点自动重置,可计算距离下一次重置的时间差并设置定时器,但移动设备后台定时器易被系统回收,因此启动/操作时检查的方案更可靠。
- 若需存储更复杂数据,可替换为Hive、SQLite等存储方案,逻辑核心一致。
内容的提问来源于stack exchange,提问作者GUN10010
相关产品推荐
相关产品推荐

