Flutter中如何让构造器强制要求参数为非负整数?
如何确保Flutter类的参数为正整数
Dart本身没有内置的“正整数”类型,没法像声明int那样直接强制参数为正数,但有几种比“仅在使用时检查”更严谨的方案:
构造函数内添加断言(assert)
这是最轻量化的方案,在构造函数里通过断言校验参数,开发阶段会触发报错,生产环境会自动忽略,不影响性能。修改你的TimerPage代码如下:class TimerPage extends StatefulWidget { final int cycleCount; final int workTime; final int breakTime; const TimerPage({ super.key, required this.cycleCount, required this.workTime, required this.breakTime, }) : assert(cycleCount > 0, "cycleCount必须为正整数"), assert(workTime > 0, "workTime必须为正整数"), assert(breakTime > 0, "breakTime必须为正整数"); @override State<TimerPage> createState() => _TimerPageState(); }开发时如果传入负值,IDE或运行时会直接抛出断言错误,能及时发现问题。
自定义正整数封装类型
如果想从类型层面彻底杜绝负值,可以封装一个PositiveInt类,在其构造函数里做校验,之后TimerPage的参数直接用这个类型:class PositiveInt { final int value; const PositiveInt(this.value) : assert(value > 0, "值必须为正整数"); // 可选:添加转换方法,方便和int互转 int toInt() => value; } class TimerPage extends StatefulWidget { final PositiveInt cycleCount; final PositiveInt workTime; final PositiveInt breakTime; const TimerPage({ super.key, required this.cycleCount, required this.workTime, required this.breakTime, }); @override State<TimerPage> createState() => _TimerPageState(); }这种方式下,调用
TimerPage时必须传入PositiveInt实例,从根源上避免了传入负值的可能。使用工厂构造函数校验
如果需要在正式环境也保留校验逻辑(断言在生产环境会被移除),可以用工厂构造函数来创建TimerPage,不符合条件时抛出异常:class TimerPage extends StatefulWidget { final int cycleCount; final int workTime; final int breakTime; const TimerPage._({ super.key, required this.cycleCount, required this.workTime, required this.breakTime, }); factory TimerPage({ Key? key, required int cycleCount, required int workTime, required int breakTime, }) { if (cycleCount <= 0 || workTime <= 0 || breakTime <= 0) { throw ArgumentError("cycleCount、workTime、breakTime必须为正整数"); } return TimerPage._( key: key, cycleCount: cycleCount, workTime: workTime, breakTime: breakTime, ); } @override State<TimerPage> createState() => _TimerPageState(); }这种方式在生产环境也会执行校验,确保参数合法性。
如果只是开发阶段防错,断言足够简单高效;如果需要严格的类型约束,自定义封装类型更可靠;生产环境要强制校验的话,工厂构造函数是合适的选择。
内容的提问来源于stack exchange,提问作者Adam Smielewski
相关产品推荐
相关产品推荐

