Значения по умолчанию для необязательного параметра должны быть постоянными флаттер / дротик - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь организовать некоторые данные класса Site в класс Event, но получаю «Значение необязательного параметра по умолчанию должно быть постоянным», и я уже некоторое время борюсь с этим.

Я нашел это: Значения по умолчанию для необязательного параметра должны быть постоянными , но мне трудно связать специфику этого примера с моим кодом.

Я намеревался использовать класс Site для поиска всех соответствующих данных сайта (адрес, телефон и т. Д. c) в конструкторе 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?

Ответы [ 2 ]

1 голос
/ 17 апреля 2020
  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 имеют параметры siteName и siteInfo. Это нормально, если поставляемый 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;
1 голос
/ 17 апреля 2020

Вы не хотите устанавливать параметр опции '=', так как он не нужен, поэтому я бы попробовал это.

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) будет go в экземпляре Event(... siteInfo: Site(siteName));

class Foo {
  String word;
  Foo({this.word});
}

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

 print(Phoo().foo.word);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...