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

如何在Dart类中实现从0开始逐次加1的自增整数ID

实现方案

不需要引入专门用于生成自增ID的第三方包,用Dart原生语法即可实现符合要求的自增int类型通知ID。
你之前使用的UniqueKey().hashCode是Flutter框架为Widget生成临时唯一标识的内置方法,返回值是随机哈希值,本身不具备顺序自增特性,自然不符合需求。


场景1:待办数据仅在APP运行期有效,无需持久化

直接通过静态变量维护全局共享的自增计数器即可,每次创建待办实例时取当前计数器值作为通知ID,之后计数器自增1:

class TodoData {
  // 全局共享计数器,初始值为0
  static int _idCounter = 0;

  final String name;
  final int notificationId;

  // 私有构造,禁止外部直接new实例
  TodoData._(this.name, this.notificationId);

  // 统一的实例创建入口,自动分配自增ID
  factory TodoData.create(String name) {
    final currentId = _idCounter;
    _idCounter++;
    return TodoData._(name, currentId);
  }
}

使用时统一调用TodoData.create("待办名称")创建实例即可,第一个实例的notificationId为0,第二个为1,依次严格递增,完全匹配flutter_local_notifications对通知ID的类型要求。


场景2:待办数据需要持久化存储(重启APP后不丢失)

如果你的待办项会存在本地缓存/本地数据库中,APP重启后仍需保留、支持取消历史绑定的通知,上面的内存计数器会在APP重启后重置为0,会和历史ID重复。这种场景只需要把当前计数器的最大值和待办数据一起持久化即可,不需要额外引入新包,复用你项目现有本地存储方案(sqlite、hive、shared_preferences等)即可:

  1. APP启动初始化时,先从本地存储读取已保存的最大ID值,给计数器赋初始值
  2. 每次生成新ID、计数器自增后,把最新的计数器值同步写入本地存储

参考实现(以shared_preferences为例,其他存储方案逻辑完全一致):

import 'package:shared_preferences/shared_preferences.dart';

class TodoData {
  static int _idCounter = 0;
  static const _counterStoreKey = 'todo_notification_id_counter';

  final String name;
  final int notificationId;

  TodoData._(this.name, this.notificationId);

  // APP启动时先调用该方法初始化计数器
  static Future<void> initIdCounter() async {
    final prefs = await SharedPreferences.getInstance();
    _idCounter = prefs.getInt(_counterStoreKey) ?? 0;
  }

  factory TodoData.create(String name) {
    final currentId = _idCounter;
    _idCounter++;
    // 自增后同步更新本地存储的计数器值
    SharedPreferences.getInstance().then((prefs) {
      prefs.setInt(_counterStoreKey, _idCounter);
    });
    return TodoData._(name, currentId);
  }
}

如果你用sqlite存储待办数据,也可以不用单独存储计数器:APP启动时直接查询表中notificationId字段的最大值,把计数器初始化为最大值 + 1即可,效果完全一致。


注意事项

  • 所有待办实例必须走统一的创建入口生成ID,不要在其他地方手动给notificationId赋值,避免ID重复
  • 删除待办项时不需要回退计数器,保持持续递增即可,int类型的取值范围完全可以覆盖普通APP的全生命周期使用需求,不存在溢出问题
  • 生成的ID是连续递增的int值,调用flutterLocalNotificationsPlugin.cancel(id)时可以精准匹配到对应通知,不会出现取消错通知的问题

内容的提问来源于stack exchange,提问作者abr ahm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:12:09