如何在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等)即可:
- APP启动初始化时,先从本地存储读取已保存的最大ID值,给计数器赋初始值
- 每次生成新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
相关产品推荐
相关产品推荐

