Сколько вызовов setState () является чрезмерным для Flutter? - PullRequest
0 голосов
/ 07 июня 2018

Я новичок во Флаттере, и реактивное программирование для меня тоже новое.

Допустим, я хочу построить таймер с Flutter.

Я добавляю Scaffold со всеми необходимыми вещами в нем и добавляю IconButton, который запускает Stopwatch иText, который отображает прошедшее время.Я также добавляю Timer.periodic для периодического (каждые 0,5 секунды) обновления текста.

Text Виджет контролирует свое собственное состояние, проверяя, запущен ли Stopwatch, и обновляя его значения.

Итак, теперь давайте предположим, что я хочу иметь более сложную логику, которая изменяет текст на основе некоторых действий с другими кнопками, которые являются родственными элементами Text.Однако невозможно вызвать setState виджета Text непосредственно из родственных виджетов.Как я понимаю, смысл реактивной парадигмы состоит в том, что состояние может передаваться по древу.Однако, если я сделаю свой Scaffold как StatefulWidget и обновлю состояние родителя каждые 0,5 секунды, он будет перерисовывать весь мой Scaffold со всеми его потомками.Поэтому в конечном итоге, когда Scaffold станет достаточно большим, ему придется обновить все вместо одного Text виджета.

Я прав?И есть ли решение для этого.Я прочитал кое-что о Streams и Sinks, однако это выглядит очень сложно, и я думаю, что должно быть другое решение.

Ответы [ 2 ]

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

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

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

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

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

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

Извлеките виджет и вызовите setState (), сформируйте этот виджет, и он не отобразит весь виджет снова

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