Какова связь между видениями состояния и состояния без учета состояния в Flutter?

Виджет с состоянием определяется как любой виджет, который изменяет свое состояние в течение его жизненного цикла. Но для StatelessWidget очень распространенной практикой является StatefulWidget как один из его детей. Разве StatelessWidget не может быть устаревшим, если у него есть StatefulWidget как один из его детей?

Я попытался изучить документацию как часть кода StatelessWidget, но не мог понять, как StatelessWidget может иметь Statefulwidget качестве своих детей и по-прежнему оставаться StatelessWidget.

Какова связь и различие между виджетами stateful и stateless в Flutter?

Ответ 1

StatelessWidget никогда не будет перестраиваться сам по себе (но может из внешних событий). StatefulWidget может. Это золотое правило.

НО любой виджет можно перекрасить в любое время.

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

Но тебя не должно волновать тип твоих детей. Это не имеет никакого влияния на вас.

Ответ 2

Состояние - это информация о том, что (1) можно читать синхронно при построении виджета и (2) может измениться в течение срока действия виджета. Ответственность за выполнение виджета несет ответственность за то, чтобы государство было незамедлительно уведомлено, когда такое состояние изменяется, используя State.setState.

StatefulWidget:

Виджет с состоянием - это виджет, который описывает часть пользовательского интерфейса, создавая созвездие других виджетов, которые более подробно описывают пользовательский интерфейс. Процесс построения продолжается рекурсивно до тех пор, пока описание пользовательского интерфейса не станет полностью конкретным (например, полностью состоит из RenderObjectWidgets, которые описывают конкретные RenderObjects).

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

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

StatelessWidget:

Виджет без состояния - это виджет, который описывает часть пользовательского интерфейса, создавая созвездие других виджетов, которые более подробно описывают пользовательский интерфейс. Процесс построения продолжается рекурсивно до тех пор, пока описание пользовательского интерфейса не станет полностью конкретным (например, полностью состоит из RenderObjectWidgets, которые описывают конкретные RenderObjects).

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

Ответ 3

Из документации на flutter.io:

... Важно отметить, что в основе оба виджета Stateless и Stateful ведут себя одинаково. Они перестраивают каждый кадр, разница в StatefulWidget имеет объект State, который хранит данные состояния через кадры и восстанавливает их.

Если вы сомневаетесь, тогда всегда помните это правило: если виджет меняет (например, пользователь взаимодействует с ним), его состояние. Однако, если ребенок реагирует на изменение, содержащий родительский элемент все еще может быть виджетами без учета состояния, если родительский элемент не реагирует на изменение.

Ответ 4

fooobar.com/questions/18640/....

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

Виджет с состоянием, однако, не обязательно такой же, как другой, построенный с теми же аргументами конструктора. Это может быть в другом состоянии.
Фактически, виджет с состоянием является неизменным (сам по себе), но Флаттер управляет отдельным объектом состояния и связывает его с виджетами, как описано в StatefulWidget doc. Это означает, что когда Flutter восстанавливает виджет с состоянием, он проверяет, следует ли ему повторно использовать предыдущий объект состояния и при желании присоединить этот объект к виджету.

Родительский виджет не имеет состояния, поскольку он не заботится о его дочернем состоянии. Самостоятельный ребенок сам (или технически Флаттер) позаботится о своем собственном состоянии.
На высоком уровне я согласен с тем, что это делает родительский виджет состоятельным, потому что два родителя могут содержать два ребенка с разными состояниями и, следовательно, быть технически разными. Но с точки зрения Флаттера он строит родительский виджет, не заботясь о состоянии, и только при построении ребенка будет учитывать его состояние.

Ответ 5

Как упоминание в документах флаттера

В чем смысл?

Некоторые виджеты имеют статус "состояние", а некоторые - без гражданства. Если виджет меняется - пользователь взаимодействует с ним, например, его состояние. Состояние виджетов состоит из значений, которые могут меняться, например, текущее значение ползунка или флажок установлен. Состояние виджетов хранится в объекте State, отделяя состояние виджетов от его внешнего вида. Когда состояние виджетов изменяется, объект состояния вызывает setState(), сообщая фреймворку перерисовать виджет.

Виджет без состояния не имеет внутреннего состояния для управления. Значок, IconButton и текст являются примерами виджетов без сохранения состояния, которые относятся к подклассу StatelessWidget.

Виджет с включенным состоянием является динамическим. Пользователь может взаимодействовать с виджетами с состоянием (например, путем ввода формы или перемещения слайдера) или со временем изменяется (возможно, канал данных заставляет пользовательский интерфейс обновляться). Флажок, Radio, Slider, InkWell, Form и TextField являются примерами виджетов с сохранением состояния, в подклассе StatefulWidget.

https://flutter.io/tutorials/interactive/#stateful-stateless

Ответ 6

Виджеты без сохранения состояния являются статическими виджетами. Вам просто нужно передать несколько свойств перед инициализацией виджетов без сохранения состояния. Они не зависят от изменений данных или поведения. Например. Text, Icon, RaisedButton - это виджеты без сохранения состояния.

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

Изменить 15/11/2018

Виджеты без сохранения состояния могут повторно визуализироваться, если изменились входные/внешние данные (внешние данные - это данные, которые передаются через конструктор). Поскольку виджеты без состояния не имеют состояния, они будут отображаться один раз и не будут обновляться самостоятельно, а будут обновляться только при изменении внешних данных.

Принимая во внимание, что Stateful Widgets имеют внутреннее состояние и могут повторно отображаться при изменении входных данных или при изменении состояния Widget.

И виджеты без состояния, и с состоянием имеют разный жизненный цикл.