Flutter空安全下如何设置可选DateTime参数?
Flutter可选DateTime字段模型类的正确实现方式
作为Flutter开发新手,我尝试创建一个包含可选DateTime类型字段的模型类,编写的代码如下:
import 'package:equatable/equatable.dart'; class Customer extends Equatable { final int indexs; final DateTime apply_date; Customer({ required this.indexs, this.apply_date, }); @override List<Object?> get props => throw UnimplementedError(); }
但遇到了如下报错:
The parameter 'apply_date' can't have a value of 'null' because of its type, but the implicit default value is 'null'. Try adding either an explicit non-'null' default value or the 'required' modifier.
我了解到有三种解决方式:1. 添加required修饰符;2. 设置初始值;3. 空标记参数(使用?),但我不理解第三种方式。我不想将该字段设为required(因为它是可选的),也不知道该设置什么初始值,请问正确的实现方式是什么?
正确实现方式:使用可空类型标记?
在Dart的空安全机制下,默认的DateTime属于非空类型,意味着它必须始终有有效值,不能为null。而你把apply_date设为可选参数时,如果没有传递值,它的隐式默认值是null,这就和非空类型的要求冲突了,所以报错。
第三种方式的核心就是把字段类型声明为可空类型,只需要在DateTime后面加上?,表示这个字段可以接受null值。同时还要修正Equatable的props方法,返回类的属性列表(Equatable需要这个来做相等性判断)。
修改后的完整代码如下:
import 'package:equatable/equatable.dart'; class Customer extends Equatable { final int indexs; // 将DateTime改为DateTime?,标记为可空类型 final DateTime? apply_date; Customer({ required this.indexs, // 可选参数,可传可不传,不传时为null this.apply_date, }); @override List<Object?> get props => [indexs, apply_date]; }
关键说明:
DateTime?表示apply_date既可以是一个有效的DateTime对象,也可以是null,完美匹配“可选字段”的需求。- 修正后的
props方法返回了[indexs, apply_date],这样Equatable就能正确比较两个Customer对象的相等性了。
内容的提问来源于stack exchange,提问作者Muhammad Faisal
相关产品推荐
相关产品推荐

