Dart类构造时自动生成UUID作为id(支持传入已有id)
更优的Dart类id实现方案
针对你需要Foo类自动生成UUID,同时兼容传入已有id且保留id字段final修饰的需求,推荐以下两种实现方式:
方案一:主构造函数+初始化列表(简洁首选)
利用Dart的初始化列表特性,在对象初始化阶段完成id的赋值,既保留final,又让类内部自动处理生成逻辑:
import 'package:uuid/uuid.dart'; const uuid = Uuid(); class Foo { final String id; final String data; // 可选id参数,未传入则自动生成UUID Foo({String? id, required this.data}) : id = id ?? uuid.v4(); }
调用示例:
// 新建对象,自动生成id var newFoo = Foo(data: "新数据"); // 从数据库加载,传入已有id var dbFoo = Foo(id: "已存在的UUID-12345", data: "数据库数据");
方案二:工厂构造函数(语义更清晰)
通过私有构造函数+工厂构造函数,区分「新建对象」和「从数据库加载」两种场景,代码可读性更强:
import 'package:uuid/uuid.dart'; const uuid = Uuid(); class Foo { final String id; final String data; // 私有构造函数,禁止外部直接实例化 Foo._({required this.id, required this.data}); // 新建对象:自动生成id factory Foo(String data) { return Foo._(id: uuid.v4(), data: data); } // 从数据库加载:传入已有id factory Foo.fromDb({required String id, required String data}) { return Foo._(id: id, data: data); } }
调用示例:
// 新建对象 var newFoo = Foo("新数据"); // 从数据库加载 var dbFoo = Foo.fromDb(id: "已存在的UUID-12345", data: "数据库数据");
这两种方案都解决了你之前的痛点:
- 保留
id字段的final修饰,避免后续被意外修改 - UUID生成逻辑封装在类内部,外部调用更简洁优雅
- 完美兼容传入已有id的场景
内容的提问来源于stack exchange,提问作者Kulpas
相关产品推荐
相关产品推荐

