首页 > 解决方案 > Flutter 在构造函数中定义 DateTime 的默认值

问题描述

我有下面的状态,想在构造函数中设置 DateTime 的默认值。我想将当前日期作为默认日期,但我不确定这是否可能,因为它需要保持不变。
DateTime.now()功能或例如DateTime.utc(1989, 11, 9)也不起作用,但是否有另一种方法来分配默认日期时间?

class CreateDidState {
  final String firstname;
  final String lastName;
  final String email;
  final String phoneNumber;
  final DateTime dateOfBirth;
  final String sex;
  final String address;
  final String city;
  final String state;
  final String postalCode;
  final String country;

  CreateDidState(
      {this.firstname = "",
      this.lastName = "",
      this.email = "",
      this.phoneNumber = "",
      this.dateOfBirth = DateTime.now(), //The default value of an optional parameter must be constant.
      this.sex = "",
      this.address = "",
      this.city = "",
      this.state = "",
      this.postalCode = "",
      this.country = ""});
}

标签: flutterdatetimedart

解决方案


问题是它DateTime.now()不是一个常量,这是有道理的,因为常量意味着可以在编译程序时确定该值,因此DateTime如果此构造函数被标记,我们将获得编译程序时的值const

正如您得到的错误所告诉的那样,您必须使用一个常量评估值作为默认值。但是我们可以在这里做一个小技巧:

class CreateDidState {
  final String firstname;
  final String lastName;
  final String email;
  final String phoneNumber;
  final DateTime dateOfBirth;
  final String sex;
  final String address;
  final String city;
  final String state;
  final String postalCode;
  final String country;

  CreateDidState(
      {this.firstname = "",
      this.lastName = "",
      this.email = "",
      this.phoneNumber = "",
      DateTime? dateOfBirth,
      this.sex = "",
      this.address = "",
      this.city = "",
      this.state = "",
      this.postalCode = "",
      this.country = ""})
      : this.dateOfBirth = dateOfBirth ?? DateTime.now();
}

我们在这里所做的是将参数声明dateOfBirth为可空值 ( DateTime?)。由于命名参数的默认值是,null这意味着我们不需要指定任何默认值。

但是我们仍然希望类字段dateOfBirth是一个不可为空的值。所以我已经this.从参数中删除了,所以这个构造函数参数与类变量无关。

然后,我将以下代码添加到构造函数的类初始化程序部分(此代码作为创建对象的一部分运行,并且允许使用值初始化类变量):

      : this.dateOfBirth = dateOfBirth ?? DateTime.now();

这意味着我们希望类变量dateOfBirth(我们this.用来告诉两个具有相同名称的变量分开)具有表达式的值dateOfBirth ?? DateTime.now()

??意味着我们返回左侧的值,除非该值为null。如果null,我们将值返回到右侧。所以如果dateOfBirthnull(如果我们不给参数一个值,因为null它是默认值,就会发生这种情况)我们使用由DateTime.now().


推荐阅读