【问题标题】:Default values of an optional parameter must be constant flutter / dart可选参数的默认值必须是常数颤振/飞镖
【发布时间】:2020-07-30 10:23:06
【问题描述】:

我正在尝试在 Event 类中组织一些 Site 类数据,但我得到一个“可选参数的默认值必须是常量”,而我已经为此苦苦挣扎了一段时间。

我发现了这个:Default values of an optional parameter must be constant,但我很难将该示例的细节与我的代码联系起来。

我的意图是使用 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 类中?

【问题讨论】:

    标签: class flutter dart constructor


    【解决方案1】:

    您不想将选项参数“=”设置为不需要它,所以我会试试这个。

    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
          );
    }
    

    Site(siteName) 将进入Event(... siteInfo: Site(siteName)); 的实例化

    class Foo {
      String word;
      Foo({this.word});
    }
    
    class Phoo {
      Foo foo = Foo(word: 'A Word');
      Phoo();
    }
    
     print(Phoo().foo.word);
    

    【讨论】:

    • 当然...创建类,然后插入它。出于好奇......甚至可以在一个类中创建一个类吗? (就像我试图做的那样?)
    • 我在上面打印的内容是可以接受的。所以是的,你可以在另一个类中实例化一个类。
    • 太棒了!感谢您更新您的答案。干杯!
    【解决方案2】:
      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 参数。如果提供的siteNamesiteInfo.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;
    

    【讨论】:

    • 感谢您的解释。我很难理解为什么它不起作用。
    猜你喜欢
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多