#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;
.