Flutter 在构造函数中定义 DateTime 的默认值

问题描述 投票:0回答:3

我有下面的状态,并想在构造函数中设置 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 = ""});
}

flutter datetime dart
3个回答
31
投票

问题是

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
,我们将值返回到右侧。因此,如果
dateOfBirth
null
(如果我们没有为参数指定值,因为
null
是默认值,就会发生这种情况),我们使用
DateTime.now()
创建的值。


3
投票

您可以使用我的 const_date_time 包来实现此目的。

import 'package:const_date_time/const_date_time.dart';

class MyClass {
  const MyClass({
    this.date = const ConstDateTime(0),
  });
  
  final DateTime date;
}

0
投票

对于那些想要简单答案的人:

class MyClass {
  MyClass(this.foo, [DateTime? dateTime])
      : myDateTime = dateTime ?? DateTime.now();

  final String foo;
  final DateTime myDateTime;
}

void main() {
  final myClass1 = MyClass('...');
  final myClass2 = MyClass('...', DateTime(2025, 1, 1));
}
© www.soinside.com 2019 - 2024. All rights reserved.