Неокончательное поле в виджете флаттера без сохранения состояния

У меня есть виджет без состояния, и при написании кода я использую неокончательное поле в виджете без состояния, и ide продолжает предупреждать меня, что 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] {}, потому что инициализация может включать функцию или циклы


person rahul Kushwaha    schedule 09.02.2020    source источник
comment
Если виджет без сохранения состояния не может делать то, что вы хотите, используйте StatedfulWidget.   -  person Ted Henry    schedule 09.02.2020
comment
Я могу сделать это. но я не использую никаких функций StateFulWidget. это не имеет смысла   -  person rahul Kushwaha    schedule 09.02.2020
comment
Как насчет создания модели данных с a, b и c и передачи модели данных в StatelessWidget?   -  person Ted Henry    schedule 09.02.2020
comment
Я не знаю о модели данных. вы можете предоставить информационную ссылку?   -  person rahul Kushwaha    schedule 09.02.2020
comment
Просто класс из трех членов: a, b, c   -  person Ted Henry    schedule 09.02.2020


Ответы (2)


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

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

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

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

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

person Ayman Al Ahnomi    schedule 09.02.2020

Вы можете использовать инициализацию даже для вызова функции.

вот пример: -

class SumWidget extends StatelessWidget {
  final int sum;

  static getSum(List<int> items) {
    int perm = 0;
    for (var value in items) {
      perm += value;
    }
    return perm;
  }

  SumWidget(List<int> roles) : this.sum = getSum(roles);

  @override
  Widget build(BuildContext context) {}
}

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

person Ravi Sevta    schedule 19.11.2020