Дарт. Поздняя инициализация конечных переменных

Есть ли способ поздней инициализации для конечных переменных. Проблема заключается в том, что многие значения инициализируются точкой входа в класс, который не является конструктором. Следовательно, они не могут быть окончательными прямо сейчас. Но в рамках конкретного класса они не будут изменены. Например,

  Controller controller;
  double width;

  void setup(final itemWidth) {
    controller =  MyController();
    width = itemWidth;
  }

Возможно ли такое? Сейчас я вижу только решение в виде аннотации. Вы могли подумать, что это для визуального эффекта. Но на самом деле это помогает избежать непредсказуемого потока во время тестирования.

3 ответа

Решение

Нет, это невозможно. Вы должны использовать не больше инициализатора конструктора.

Теперь можно поздно инициализировать переменные. Для получения дополнительной информации см . Документацию Dart . Текст ниже скопирован из документации Dart:

Поздние финальные переменные

Также можно комбинировать поздний с финальным:

      // Using null safety:
class Coffee {
  late final String _temperature;

  void heat() { _temperature = 'hot'; }
  void chill() { _temperature = 'iced'; }

  String serve() => _temperature + ' coffee';
}

В отличие от обычных полей final, вам не нужно инициализировать поле в его объявлении или в списке инициализации конструктора. Вы можете назначить его позже во время выполнения. Но вы можете назначить его только один раз , и этот факт проверяется во время выполнения. Если вы попробуете назначить ему более одного раза - как вызовите оба а также здесь - второе присваивание вызывает исключение . Это отличный способ моделирования состояния, которое в конечном итоге инициализируется и впоследствии становится неизменным.

Я не уверен, что понимаю вашу проблему, поскольку ваш пример можно легко сделать следующим образом:

class Controller {}
class MyController implements Controller {}

class MyClass {
  final Controller controller;
  final double width;

  MyClass(this.width) : controller = MyController();
}

Можете ли вы привести лучший пример, показывающий вашу проблему?

Другие вопросы по тегам