Class 可选参数的默认值必须为常量颤振/省道

Class 可选参数的默认值必须为常量颤振/省道,class,flutter,dart,constructor,Class,Flutter,Dart,Constructor,我试图在事件类中组织一些站点类数据,但是我得到了一个“可选参数的默认值必须是常量”,我已经为此挣扎了一段时间 我发现了这个:,但是我很难将这个例子的细节与我的代码联系起来 我的意图是使用Site类在Site构造函数中查找所有相关的Site数据(地址、电话等),然后将其作为自己的参数存储在Event类中。。。但我不确定最好的方法 代码如下: class Event { // passed final TimeOfDay earliestTime; final DateTime star

我试图在事件类中组织一些站点类数据,但是我得到了一个“可选参数的默认值必须是常量”,我已经为此挣扎了一段时间

我发现了这个:,但是我很难将这个例子的细节与我的代码联系起来

我的意图是使用Site类在Site构造函数中查找所有相关的Site数据(地址、电话等),然后将其作为自己的参数存储在Event类中。。。但我不确定最好的方法

代码如下:

class Event {
  // passed
  final TimeOfDay earliestTime;
  final DateTime startTime;
  final String siteName;

  Site siteInfo;

  Event(
      {
      @required this.earliestTime,
      @required this.startTime,
      @required this.siteName,
      this.siteInfo = Site(siteName)} //<-- "Site(siteName) is underlined in red with the
                                      // non_constant_default_value error
      ) { }
}


class Site {
  String siteName;
  Site(String siteName) {
    this.siteName = "Site 1";  //<-- my attempt at a default value
    int index = sites.indexOf(siteName); 
    phone = phones[index];
    addressStreet = addressStreets[index];
  }

  String addressStreet;
  String phone;
}

List<String> sites = [  // <-- Site lookup table
  "Site 1",
  "Site 2",
];


List<String> phones = [  // <-- use index to get values
  "(312)857-5309",
  "(773)857-5310",
];

List<String> addressStreets = [
  "123 Bear St.",
  "234 Elk St.",
];
类事件{
//通过
一天中的最后一个时间最早;
最终日期时间开始时间;
最终字符串siteName;
网站信息;
事件(
{
@需要这个。最早的时候,
@需要这个。开始时间,
@需要此名称。siteName,

this.siteInfo=Site(siteName)}/您不想将选项参数“=”设置为不需要,因此我会尝试此方法

class Event {
  // passed
  final TimeOfDay earliestTime;
  final DateTime startTime;
  final String siteName;

  Site siteInfo;

  Event(
      {
      @required this.earliestTime,
      @required this.startTime,
      @required this.siteName,
      this.siteInfo, //<-- "Site(siteName) is underlined in red with the
      }                      // non_constant_default_value error
      );
}
事件({
@需要这个。最早的时候,
@需要这个。开始时间,
@需要此名称。siteName,
this.siteInfo=Site(siteName)
}) {}
您指定,如果某个对象构造了
事件
对象,但忽略了
siteInfo
参数,则
事件
构造函数应将
siteInfo
初始化为
Site(siteName)
的默认值。但是,Dart要求默认参数值为编译时常量,并且
Site>(siteName)
无法在编译时确定,因为它取决于
siteName

通常,您可以将默认值设为
null
,然后通过初始化列表对其进行初始化:

事件({
@需要这个。最早的时候,
@需要这个。开始时间,
@需要此名称。siteName,
站点信息
}):siteInfo=siteInfo??站点(siteName){}
或者在构造函数主体中

也就是说,我不清楚您是否真的希望
Event
同时具有
siteName
siteInfo
参数。如果提供的
siteName
siteInfo.siteName
不同,可以吗?如果不是,那么
Event
构造函数应该要求只向elimin提供一个参数避免任何不一致的可能性,例如:

事件({
@需要这个。最早的时候,
@需要这个。开始时间,
@需要此名称。siteName,
}):siteInfo=Site(siteName){}

事件({
@需要这个。最早的时候,
@需要这个。开始时间,
@需要此文件。siteInfo
}) {}
字符串get siteName=>siteInfo.siteName;

当然……创建类,然后插入。出于好奇……甚至可以在类中创建类吗?(就像我尝试的那样?)我上面打印的内容是可以接受的。因此,是的,您可以在另一个类中实例化一个类。太好了!感谢您对答案的更新。干杯!感谢您的解释。我很难理解为什么它不起作用。
class Foo {
  String word;
  Foo({this.word});
}

class Phoo {
  Foo foo = Foo(word: 'A Word');
  Phoo();
}

 print(Phoo().foo.word);