Почему определенные переменные помечены как окончательные в пользовательских классах флаттера? - PullRequest
0 голосов
/ 01 мая 2018

Я заметил в некоторых онлайн-примерах, что классы, расширяющие StatefulWidget, имеют переменные экземпляра, помеченные как final. Это почему ? Я понимаю, что делает последнее ключевое слово. Я не понимаю, почему оно объявляется с каждой переменной экземпляра, которая расширяет класс виджета.

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Поскольку StatefulWidget наследует Widget, который помечен как @immutable, любой подкласс StatefulWidget также должен быть неизменным (т.е. все поля final).

Если вы создадите подкласс StatefulWidget с неокончательными полями, это вызовет предупреждение DartAnalysis:

info: этот класс наследуется от класса, помеченного как @immutable, и поэтому должен быть неизменным (все поля экземпляра должны быть окончательными). (must_be_immutable в [...] lib .... dart: 23)

И объяснение того, как использовать StatefulWidget из StatefulWidget документации :

Сами экземпляры StatefulWidget неизменны и хранят свои изменяемое состояние либо в отдельных объектах состояния, которые создаются метод createState или объекты, на которые подписано это государство, для пример объектов Stream или ChangeNotifier, ссылки на которые хранится в конечных полях самого StatefulWidget.

0 голосов
/ 04 апреля 2019

«final» очень похож на «const» в приложении, но отличается по причинам времени компиляции: см. Эту ссылку или ниже для дальнейшего объяснения:

"final" означает одиночное присваивание: конечная переменная или поле должны иметь инициализатор. После присвоения значения окончательное значение переменной не может быть изменено. окончательное изменение переменных .

"const" имеет значение, которое немного сложнее и тоньше в Dart. const изменяет значения . Вы можете использовать его при создании коллекций, таких как const [1, 2, 3], и при создании объектов (вместо новых), таких как const Point (2, 3). Здесь const означает, что все глубокое состояние объекта может быть полностью определено во время компиляции и что объект будет заморожен и полностью неизменен.

0 голосов
/ 01 мая 2018

Нет окончательного ответа на этот вопрос. Это больше предпочтение.

Факт в том, что если переменная может быть объявлена ​​как final, то почему не объявлять так? Ключевое слово final не повредит вашему коду и потенциально может помочь выявить ошибки.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...