Разделение виджета с состоянием на две части является обязательным требованием некоторых шаблонов флаттера.Виджеты, представляющие собой чистую функцию , которую можно найти в функциональном программировании.
Фактически React, библиотека, из которой флаттер черпает вдохновение, также использует два отдельных объекта.Это довольно очевидно при использовании следующего синтаксиса:
class MyComponent extends React.Component<Props, State> {
state: State = {
foo: 42,
}
...
}
Да, но почему State
и подкласс Stateful
глубоко связаны?Почему я не могу использовать любой класс как State
?
Ах, это интересный вопрос!Для тех, кто привык реагировать раньше, это то, что вы можете сделать там.React может использовать любой объект как его состояние.Флаттер так похож, почему мы тоже не можем?
В конце концов, с небольшим количеством настроек, ничто не мешает следующему синтаксису, даже флаг @immutable
:
class MyStateful extends StatefulWidget<Video> {
@override
void dispose() {}
@override
build(BuildContext context) {
return new Text(state.title);
}
}
Так почему?
Цитата из флаттера Документация :
Вы можете удивиться, почему StatefulWidget и State являются отдельными объектами.Во Флаттере эти два типа объектов имеют разные жизненные циклы.Виджеты - это временные объекты, используемые для построения представления приложения в его текущем состоянии.С другой стороны, объекты состояния постоянны между вызовами build (), что позволяет им запоминать информацию.
Это будет означать, что у нас будут все переопределения методов жизненного цикла, которые вы можете иметь в State
перейти к подклассу Stateful
.Например, initState
, но также dispose
или didUpdateWidget
.Что не имеет смысла, учитывая, что виджеты - это просто бросаемые объекты, которые никогда не обновляются.