Перестраивает ли setState все дерево виджетов для дрожащего экрана и как это соотносится с другим управлением состоянием - PullRequest
0 голосов
/ 10 июля 2020

Я немного сбит с толку, я недавно изучал управление состоянием с флаттером, и мне было интересно, что произойдет, если пользовательский виджет с отслеживанием состояния будет помещен в виджет без состояния, допустим, widgetA (parent) - это виджет без состояния, и он имеет дочерний WidgetB, который является виджетом с отслеживанием состояния, и другой дочерний виджет Widget C, который является виджетом без состояния.

Теперь мои вопросы:

  • если setState () вызывается из widgetB, перестроены ли WidgetA, B и C?
  • как это соотносится с использованием различных методов управления состоянием, таких как поставщик состояния, построители потоков или Blo c?
  • когда использовать setState ()?
  • разумно ли комбинировать несколько методов управления состоянием?

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

1 Ответ

2 голосов
/ 10 июля 2020

Если я говорю что-то не так, пожалуйста, поправьте меня.

Отвечая на ваши вопросы по порядку:

  1. Если вы позвоните setState() на WidgetB it ' ll перестраивает себя и своих потомков, независимо от того, являются ли они Stateless или Stateful виджетами.

  2. Используя подход BLo C, большая часть иногда необязательно использовать Stateful Widgets и setState() для управления состоянием. В этом подходе вы будете использовать events из UI , который будет преобразован в «Состояния» внутри вашего BLo C. Эти состояния будут переданы в Stream. Ваш UI будет перестраиваться с использованием StreamBuilders каждый раз, когда они будут прослушивать новое значение в потоке, который они слушают. Это заставит StreamBuilder восстановить себя и его потомков.

  3. Если вы используете BLoC или Provider + Streams, я бы рекомендовал избегать setState() и StatefulWidgets, возможно, с некоторыми исключениями, такими как UI, например. анимации.

  4. BLo C - это дизайнерский подход, который хорошо сочетается с Provider package. BLoC package даже использует Provider внутри.

PS: В то время как BLoC - это шаблон архитектуры для управления данными и состоянием вашего приложения. Провайдер - это «просто» оболочка вокруг Inherited Widgets, которая облегчает доступ к данным по всему дереву виджетов, а не шаблон архитектуры.

Другой пример решения шаблона архитектуры для управления состоянием, использующего пакет provider: MobX.

...