首页 > 解决方案 > 可选参数的默认值必须是常数颤振/飞镖

问题描述

我正在尝试在 Event 类中组织一些 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.",
];

简而言之,错误是什么,我将如何使用 Site 类作为在 Event 类中保存所有站点数据的一种方式?

标签: classflutterdartconstructor

解决方案


  Event({
    @required this.earliestTime,
    @required this.startTime,
    @required this.siteName,
    this.siteInfo = Site(siteName)
  }) {}

您指定如果某些东西构造了一个Event对象但省略了siteInfo参数,则Event构造函数应初始化siteInfo为默认值Site(siteName). 但是,Dart 要求默认参数值是编译时常量,并且Site(siteName)无法在编译时确定,因为它依赖于siteName.

通常,您可以改为使用默认值null并稍后通过初始化列表对其进行初始化:

  Event({
    @required this.earliestTime,
    @required this.startTime,
    @required this.siteName,
    Site siteInfo
  }) : siteInfo = siteInfo ?? Site(siteName) {}

或在构造函数体内。

也就是说,我不清楚你是否真的想要Event同时拥有siteNamesiteInfo参数。如果提供siteName的与 不同,可以siteInfo.siteName吗?如果不是,则Event构造函数应要求仅提供一个以消除任何不一致的可能性,例如:

  Event({
    @required this.earliestTime,
    @required this.startTime,
    @required this.siteName,
  }) : siteInfo = Site(siteName) {}

或者

  Event({
    @required this.earliestTime,
    @required this.startTime,
    @required this.siteInfo
  }) {}

  String get siteName => siteInfo.siteName;

推荐阅读