Назначение StatefulWidgets в Flutter? - PullRequest
0 голосов
/ 03 июня 2018

Вот пример StatefulWidget.Но разве это не просто код котельной плиты?Зачем нам два класса?Обычно вы копируете и вставляете часть extends StatefulWidget, но где цель?Есть ли скрытый функционал?Или это какой-то уровень абстракции?Почему команда Flutter выбрала этот дизайн?

 class Counter extends StatefulWidget {
      int someVar;
      Counter(this.someVar);

      @override
      _CounterState createState() => new _CounterState();
    }

А вот и Государственный класс.Разве этого класса недостаточно?Зачем нам два класса для StatefulWidget?

class _CounterState extends State<Counter> {
  int _counter = 0;

  void _increment() {
    setState(() {
      ++_counter;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Row(children: <Widget>[
      new CounterIncrementor(onPressed: _increment),
      new CounterDisplay(count: _counter),
    ]);
  }
}

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

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

Фактически 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.Что не имеет смысла, учитывая, что виджеты - это просто бросаемые объекты, которые никогда не обновляются.

0 голосов
/ 03 июня 2018

Потому что все Widgets неизменны.Это означает, что ваш класс Counter в этом случае является неизменным, и, следовательно, все переменные должны быть final.State, однако, не является изменяемым.

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

AВиджет является неизменным описанием части пользовательского интерфейса.[...] Сами виджеты не имеют изменяемого состояния (все их поля должны быть окончательными).Если вы хотите связать изменяемое состояние с виджетом, рассмотрите возможность использования StatefulWidget, который создает объект State (через StatefulWidget.createState) всякий раз, когда он надувается в элемент и включается в дерево.

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