не финальное поле в виджете флаттера без сохранения состояния - PullRequest
1 голос
/ 09 февраля 2020

У меня есть виджет без сохранения состояния, и при написании кода я использую неконечное поле в виджете без сохранения состояния, и я продолжаю предупреждать, что all the fields in stateless widget should be final

Но я не понимаю, почему не финальное поле в виджете без состояния может быть проблемой.

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

пример:

class Temp extends StatelessWidget {
  final int a;
  final int b;
  int c;
  temp({this.a, this.b}) {
    this.c = this.a + this.b;
  }
  @override
  Widget build(BuildContext context) {}
}

В приведенном выше виджете я не могу сделать c как окончательный, потому что он инициализируется внутри функции конструктора, хотя у меня нет планов по изменению переменной c в будущем.

Если наличие не конечного поля в виджете без состояния не является хорошей идеей, то как чтобы справиться с вышеуказанной ситуацией.

Примечание : я не могу использовать Constructor() : [initialization] {}, потому что инициализация может включать функцию или циклы

1 Ответ

0 голосов
/ 09 февраля 2020

StatelessWidget class Виджет, который не требует изменяемого состояния, поэтому класс помечен как @immutable, язык Dart сделает все возможное, чтобы исправить ваши ошибки, поэтому ключевое слово «final» просто предупредит вас об этом, но не остановит компиляцию Вы можете использовать свой код без ключевого слова final, если вы уверены, что он будет инициализирован один раз и не изменится во время выполнения ..

, и это является основной причиной наличия 2 ключевых слов (final, const) для определения констант на языке дартс

И final, и const предотвращают переназначение переменной.

const значение должно быть известно во время компиляции, const birth = "2020 / 02 / 09" . Не может быть изменено после того, как инициализированное

окончательное значение должно быть известно во время выполнения, окончательное рождение = getBirthFromDB (). Не может быть изменено после инициализации

...