Виджет с отслеживанием состояния определяется как любой виджет, который меняет свое состояние в течение своего времени существования. Но это очень распространенная практика, когда a StatelessWidget
является StatefulWidget
одним из его дочерних элементов. Не StatelessWidget
переходит в состояние, если у него есть StatefulWidget
один из его дочерних элементов?
Я попытался заглянуть в документацию как часть кода StatelessWidget
, но не мог понять, как StatelessWidget
может иметь Statefulwidget
дочерние элементы и при этом оставаться StatelessWidget
.
В чем связь и разница между виджетами с сохранением состояния и без состояния во Flutter?
dart
flutter
statefulwidget
statelesswidget
user462455
источник
источник
InheritedWidget
; Который может сделатьStatelessWidget
обновление.Ответы:
StatelessWidget никогда не будет перестраивать само по себе (но может от внешних событий). StatefulWidget может. Это золотое правило.
НО любой виджет можно перекрашивать в любой момент.
Без сохранения состояния означает только то, что все его свойства неизменяемы, и единственный способ изменить их - создать новый экземпляр этого виджета. Например, это не блокирует дерево виджетов.
Но вам не важно, какого типа ваши дети. На вас это никак не влияет.
источник
rebuild
иrepaint
StateFulWidget
s тоже неизменяемы.StatefulWidget против StatelessWidget.
StatelessWidget - виджет, не требующий изменяемого состояния.
class GreenFrog extends StatelessWidget { const GreenFrog({ Key key }) : super(key: key); @override Widget build(BuildContext context) { return Container(color: const Color(0xFF2DBD3A)); } }
StatefulWidget - виджет с изменяемым состоянием.
Когда Flutter строит
StatefulWidget
, он создает объект State. В этом объекте хранится все изменяемое состояние для этого виджета.Понятие состояния определяется двумя вещами:
Жизненный цикл StatefulWidget
Жизненный цикл состоит из следующих упрощенных этапов:
createState()
.@override _MyState createState() => _MyState();
this.mounted
свойство bool . Он становится истинным, когдаbuildContext
присваивается. Вызов,setState
когда виджет отключен, является ошибкой . Находится ли данный объект State в данный момент в дереве.bool get mounted => _element != null;
initState
вызывается один раз и только один раз. Он должен позвонитьsuper.initState().
@override initState() { super.initState(); // Add listeners to this class cartItemStream.listen((data) { _updateWidget(data); }); }
@protected @mustCallSuper void didChangeDependencies() { }
Платформа вызывает этот метод в различных ситуациях:
initState
.didUpdateWidget
.setState
.@override Widget build(BuildContext context, MyButtonState state) { ... () { print("color: $color"); } ... }
@mustCallSuper @protected void didUpdateWidget(covariant T oldWidget) { }
setState
:Это редко используется.
@protected @mustCallSuper void deactivate() { }
@protected @mustCallSuper void dispose() { assert(_debugLifecycleState == _StateLifecycle.ready); assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }()); }
Для получения дополнительной информации перейдите здесь здесь , здесь
источник
Из документации на flutter.io :
источник
Как упоминается в документации по флаттеру
В чем смысл?
Некоторые виджеты сохраняют состояние, а некоторые - без него. Если виджет изменяется - например, пользователь взаимодействует с ним - он сохраняет состояние. Состояние виджета состоит из значений, которые могут изменяться, например, текущего значения ползунка или того, установлен ли флажок. Состояние виджета хранится в объекте State, отделяя состояние виджета от его внешнего вида. Когда состояние виджета изменяется, объект состояния вызывает setState (), сообщая фреймворку перерисовать виджет.
Виджет без гражданства не имеет внутреннего состояния для управления. Icon, IconButton и Text являются примерами виджетов без сохранения состояния, которые являются подклассом StatelessWidget.
С сохранением состояния виджета является динамическим. Пользователь может взаимодействовать с виджетом с отслеживанием состояния (например, вводя текст в форму или перемещая ползунок), или он изменяется со временем (возможно, поток данных вызывает обновление пользовательского интерфейса). Checkbox, Radio, Slider, InkWell, Form и TextField являются примерами виджетов с отслеживанием состояния, которые являются подклассом StatefulWidget.
https://flutter.io/tutorials/interactive/#stateful-stateless
источник
Состояние - это информация, которая (1) может быть прочитана синхронно при построении виджета, а (2) может измениться в течение срока службы виджета. Разработчик виджета несет ответственность за то, чтобы состояние было оперативно уведомлено при изменении такого состояния с помощью State.setState.
StatefulWidget :
Виджет с отслеживанием состояния - это виджет, который описывает часть пользовательского интерфейса, создавая совокупность других виджетов, которые более конкретно описывают пользовательский интерфейс. Процесс построения продолжается рекурсивно до тех пор, пока описание пользовательского интерфейса не станет полностью конкретным (например, полностью состоит из RenderObjectWidgets, которые описывают конкретные RenderObjects).
Виджет с отслеживанием состояния полезен, когда часть пользовательского интерфейса, которую вы описываете, может изменяться динамически, например, из-за наличия внутреннего состояния, управляемого часами, или в зависимости от некоторого состояния системы. Для композиций, которые зависят только от информации о конфигурации в самом объекте и BuildContext, в котором виджет раздувается, рассмотрите возможность использования StatelessWidget.
Сами экземпляры StatefulWidget являются неизменяемыми и хранят свое изменяемое состояние либо в отдельных объектах State, которые создаются методом createState, либо в объектах, на которые это State подписывается, например объектах Stream или ChangeNotifier, ссылки на которые хранятся в конечных полях в StatefulWidget. сам.
StatelessWidget :
Виджет без сохранения состояния - это виджет, который описывает часть пользовательского интерфейса, создавая совокупность других виджетов, которые более конкретно описывают пользовательский интерфейс. Процесс построения продолжается рекурсивно до тех пор, пока описание пользовательского интерфейса не станет полностью конкретным (например, полностью состоит из RenderObjectWidgets, которые описывают конкретные RenderObjects).
Виджет без сохранения состояния полезен, когда описываемая часть пользовательского интерфейса не зависит ни от чего, кроме информации о конфигурации в самом объекте и BuildContext, в котором виджет раздувается. Для композиций, которые могут изменяться динамически, например, из-за наличия внутреннего состояния, управляемого часами, или в зависимости от некоторого состояния системы, рассмотрите возможность использования StatefulWidget.
источник
Виджеты без сохранения состояния - это статические виджеты. Вам просто нужно передать несколько свойств перед инициализацией виджетов без сохранения состояния. Они не зависят от изменений данных или поведения. Например. Text, Icon, RaisedButton - это виджеты без сохранения состояния.
Виджеты с отслеживанием состояния - это динамические виджеты, они могут обновляться во время выполнения в зависимости от действий пользователя или изменения данных. Если виджет может изменять свое состояние во время выполнения, он будет виджетом с отслеживанием состояния.
Изменить 15/11/2018
Виджеты без сохранения состояния могут повторно отображаться, если входные / внешние данные изменились (внешние данные - это данные, которые передаются через конструктор). Поскольку виджеты без сохранения состояния не имеют состояния, они будут отображаться один раз и не будут обновляться, а будут обновляться только при изменении внешних данных.
В то время как виджеты с отслеживанием состояния имеют внутреннее состояние и могут повторно визуализироваться при изменении входных данных или при изменении состояния виджета.
У виджетов без состояния и виджетов с отслеживанием состояния разный жизненный цикл.
источник
Stateless
виджет, мы можем изменить его во время выполнения, но он не называетсяStateful
виджетом (в отличие от вашей последней строки).Я могу придумать очень простую аналогию. У вас есть мебель с книгами, украшениями и телевизором. Мебель без гражданства, она ничего не делает, не двигается. В телевизоре, с другой стороны, вы можете включать, выключать, переключать канал, воспроизводить фильм, если к нему подключен какой-либо DVD, и т. Д. У телевизора есть внутреннее состояние, которое влияет на его поведение. В мебели у вас нет гос. Наличие телевизора в мебели не добавляет ей состояния. Надеюсь это поможет.
источник
Ответ на вопрос о переполнении стека - состояние или отсутствие состояния .
Во Flutter разница в том, что виджеты без состояния могут быть определены только всеми аргументами конструктора. Если вы создадите два виджета без состояния, используя одни и те же аргументы, они будут одинаковыми.
Однако виджет с отслеживанием состояния не обязательно совпадает с другим, построенным с теми же аргументами конструктора. Это могло быть в другом состоянии.
Фактически, виджет с сохранением состояния сам по себе является неизменяемым (без состояния), но Flutter управляет отдельным объектом состояния и связывает его с виджетом, как описано в документе StatefulWidget . Это означает, что когда Flutter перестраивает виджет с отслеживанием состояния, он проверяет, следует ли повторно использовать предыдущий объект состояния, и, при желании, присоединяет этот объект состояния к виджету.
Родительский виджет не имеет состояния, потому что он не заботится о состоянии своего дочернего элемента. Сам дочерний элемент с состоянием (или технически Flutter) позаботится о своем собственном состоянии.
На высоком уровне я согласен с тем, что это делает родительский виджет с отслеживанием состояния, потому что два родителя могут содержать два дочерних элемента с разными состояниями и, таким образом, сами быть технически разными. Но с точки зрения Flutter, он создает родительский виджет, не заботясь о состоянии, и только при создании дочернего виджета учитывается его состояние.
источник
Что такое виджеты с отслеживанием состояния и без состояния?
TL; DR: виджет, который позволяет обновлять экран, является виджетом с отслеживанием состояния. Виджет, который не имеет состояния.
Более подробно, динамический виджет с содержанием, которое может изменяться, должен быть виджетом с отслеживанием состояния. Виджет без сохранения состояния может изменять содержимое только при изменении параметров, и, следовательно, это необходимо делать выше точки его расположения в иерархии виджетов. Экран или виджет, содержащий статическое содержимое, должен быть виджетом без состояния, но для изменения содержимого он должен иметь состояние.
Я нашел это относительное содержание в интересном средстве массовой информации. Пожалуйста!
источник
Без сохранения состояния: состояние виджета создается ТОЛЬКО ОДИН РАЗ, затем он может обновлять значения, но не состояние явно. Это также видно из структуры. Вот почему у него есть только один класс, который расширяется с помощью
StatelessWidget
. Итак, если я скажу, они никогда не смогут повторно запуститьbuild()
метод снова.С отслеживанием состояния : виджеты могут обновлять свое СОСТОЯНИЕ (локально) и значения несколько раз при срабатывании события . По этой причине реализация тоже разная. В этом, у нас есть 2 класса, один
StatefulWidget
и другой его состояние реализации обработчика т.е.State<YourWidget>
. Итак, если я скажу, они могут повторно запуститьbuild()
метод снова и снова в зависимости от инициированных событий.Схема ниже поможет.
источник
При написании приложения вы обычно создаете новые виджеты, которые являются подклассами StatelessWidget или StatefulWidget.
Вот некоторые различия между виджетами
StatelessWidget
иStatefulWidget
виджетами:Виджет без сохранения состояния:
Text
,Icon
,RaisedButton
являются Апатриды виджетов.Виджет без сохранения состояния:
Checkbox
,Radio Button
,Slider
являются Stateful виджетыисточник
Виджет без состояния и с сохранением состояния имеет собственный жизненный цикл для создания и обновления пользовательского интерфейса. однако вы можете использовать либо без состояния, либо с сохранением состояния для рендеринга пользовательского интерфейса, но на практике с сохранением состояния более удобно, когда пользовательский интерфейс полностью или частично зависит от внешних данных (например, рендеринг списка с использованием API), тогда как использование виджета без состояния для отображения статического пользовательского интерфейса, как любой экран ввода, хорошая практика.
источник
Простыми словами:
Как мы знаем, каждый виджет - это вид во флаттере. У которого есть свои классы. Когда мы используем эти классы, мы создаем из них объект. Мы даем значения их различным переменным / свойствам. Ex. Мы создаем текстовый виджет, поэтому можем присвоить ему строку, цвет, размер шрифта, семейство шрифтов. Таким образом, давая это, мы определяем его свойства при его создании. До этого момента виджеты без сохранения состояния или с отслеживанием состояния были одинаковыми, но,
Когда мы хотим изменить / обновить его свойства (скажем, String или Color) снова и снова, тогда это должен быть виджет Stateful.
И когда мы не хотим изменять его свойства после определения в первый раз, это виджет без состояния.
это означает, что мы заботимся о данных, которые виджет хранит / контролирует / показывает.
Таким образом, Stateless - это меньше данных, а Stateful - это полные данные.
Теперь, если вы определяете класс, который не имеет состояния, это означает, что этот класс не заботится / имеет в нем переменные или говорит данные в своем собственном классе, то есть на уровне класса, но в нем может быть другой виджет / класс, который заботится о данных, т.е. . Так что никак не влияют друг на друга.
Пожалуйста, поправьте меня, если я ошибаюсь.
источник
Что такое виджеты с отслеживанием состояния и без состояния?
Виджет без сохранения состояния: виджет без состояния создается только тогда, когда он имеет родительские изменения.
Виджеты с отслеживанием состояния: виджеты с полным состоянием содержат состояние виджета и могут быть перестроены при изменении состояния.
источник