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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:10:49