Используйте аргументы конструктора для вычисления конечных значений, зависящих друг от друга. Flutter / Dart

#constructor #dart #flutter #initialization #widget

#constructor #dart #flutter #инициализация #виджет

Вопрос:

У меня есть виджет, который принимает число, представляющее страницы, разрешенные для отображения на экране. Если устройство слабое, bool может быть передано значение, переопределяющее начальное значение. Однако, поскольку все значения являются окончательными, я должен оценить их в конструкторе до установки значения.

 class _A extends StatefullWidget{

  _A(this.limitPages, 
    this.pagesToDisplay: limitPages ? 10 : pagesToDisplay,
  )

  final int pagesToDisplay;
  final bool limitPages;
}
  

Я мог бы объявить это в списке инициализаторов, но тогда я не могу передать аргумент для pagesToDisplay .

 class _A extends StatefullWidget{
  _A(this.limitPages)
    :this.pagesToDisplay: limitPages ? 10 : pagesToDisplay

  final int pagesToDisplay;
  final bool limitPages;
}
  

Есть ли какой-либо способ утвердить оператор в / перед тем, как конструктор установит конечное значение?

Ответ №1:

Если вы хотите использовать параметр в списке инициализаторов, этот параметр не может быть параметром инициализации, и вместо этого вам нужно выполнить инициализацию в списке инициализаторов:

 class _A {
  _A(bool limitPages, int pagesToDisplay)
      : limitPages = limitPages,
        pagesToDisplay = limitPages ? 10 : pagesToDisplay;

  final int pagesToDisplay;
  final bool limitPages;
}
  

Комментарии:

1. Да, спасибо. Я боялся, что изменение имени переменной приведет к нарушению работы библиотеки для существующих пользователей, но присвоение ей того же имени должно устранить это препятствие.

2. Верно, пока вы сохраняете одно и то же имя, это не нарушает работу пользователей этого кода.

3. Следующий вопрос: если у меня есть третье свойство, которое зависит от результата pagesToDisplay, как мне связать его, чтобы я мог вычислить это значение с предыдущим? Например, scrollDistanceToBottom = pagesToDisplay/screenWidth это выдаст ошибку only static members can be accessed in initializers . Нужно ли мне использовать предыдущую инструкцию для повторного вычисления того же значения снова? т.е. scrollDistanceToBottom = (limitPages ? 10 : pagesToDisplay)/screenWidth

4. Это не поддерживается. Невозможно ввести переменные в список инициализаторов, которые могли бы содержать значения. Вы можете либо вычислить значение дважды, либо в качестве альтернативы вы можете изменить свой конструктор на частный конструктор и добавить общедоступный конструктор factory, который вычисляет значения и пересылает предварительно вычисленные значения в частный конструктор, так что никаких вычислений (или даже списка инициализаторов) не требуется..

5. Вы можете сослаться на формализатор инициализации в списке инициализаторов, поэтому _A(this.limitPages, int pagesToDisplay) : pagesToDisplay = limitPages ? 10 : pagesToDisplay; он действителен. Поскольку pagesToDisplay аргумент игнорируется, когда limitPages имеет значение true, его передача кажется расточительной, и, вероятно, было бы лучше иметь два конструктора: _A.limited() : limitPages = true, pagesToDisplay = 10; и _A.pages(this.pagesToDisplay) : limitPages = false; .