Dart如何在类初始化列表中调用函数完成参数校验
问题原因分析
你的代码存在两处核心错误:
- 参数引用错误:调用
isValidOrThrow时传入的fromString: uuid中的uuid变量未定义,实际应该传入构造函数的入参value - 初始化列表语法错误:Dart 初始化列表的项只能是实例变量赋值、父类构造调用、assert断言三类,不能直接放置独立的方法调用语句
可行实现方案
两种方案都可以保留isValidOrThrow的校验逻辑,同时完全符合Dart空安全规则:
方案1:初始化列表丢弃变量赋值(Dart 3.0+ 推荐,最简洁)
如果你的项目使用Dart 3.0及以上版本,可以直接把校验方法的返回值赋值给全局丢弃变量_,既满足初始化列表的语法要求,又能在校验不通过时直接抛出异常阻断实例创建,同时给value加final修饰符符合值对象不可变的设计规范:
import 'package:uuid/uuid.dart' as uuidLibrary; class Uuid { final String value; Uuid(String value) : _ = uuidLibrary.Uuid.isValidOrThrow(fromString: value), value = value; }
方案2:工厂构造函数(兼容所有Dart版本,可读性最高)
用工厂构造函数先执行校验逻辑,校验通过后再返回实例,逻辑顺序直观,同时私有构造保证外部只能通过带校验的方法创建实例,没有版本依赖:
import 'package:uuid/uuid.dart' as uuidLibrary; class Uuid { final String value; factory Uuid(String value) { uuidLibrary.Uuid.isValidOrThrow(fromString: value); return Uuid._internal(value); } Uuid._internal(this.value); }
内容的提问来源于stack exchange,提问作者Kirpich643
相关产品推荐
相关产品推荐

