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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:42:21