Дарт. Поздняя инициализация конечных переменных
Есть ли способ поздней инициализации для конечных переменных. Проблема заключается в том, что многие значения инициализируются точкой входа в класс, который не является конструктором. Следовательно, они не могут быть окончательными прямо сейчас. Но в рамках конкретного класса они не будут изменены. Например,
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();
}
Можете ли вы привести лучший пример, показывающий вашу проблему?