Управление состоянием флаттера (BloC): виджет без сохранения состояния или виджет с отслеживанием состояния

Итак, я читаю Bloc по управлению состоянием для flutter.

Поскольку Bloc позволяет вам погружаться и стримить (перестраивать виджет на основе ввода), то можно ли создать приложение в основном с виджетами без сохранения состояния?

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

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

В этом подходе я не вижу необходимости использовать виджет с отслеживанием состояния. Конечно, будучи абсолютным новичком в flutter, я хотел услышать, есть ли в этом подходе какие-то достоинства.

Это хороший подход? Любая информация будет принята с благодарностью.


person Steve Kim    schedule 14.11.2019    source источник
comment
Попробуйте использовать шаблон поставщика, намного проще и также поддерживает потоки, и вы можете использовать либо виджеты с сохранением состояния, либо виджеты без состояния, не принимая во внимание поставщика.   -  person skjagini    schedule 14.11.2019
comment
Да, я изучил шаблон поставщика, но, похоже, есть общее мнение, что он не идеален для сложного приложения и довольно хорош для прототипирования, поскольку имеет ограничение разделения представления и бизнес-логики. С таким же успехом можно начать с Блока.   -  person Steve Kim    schedule 15.11.2019
comment
Вы пишете классы Provider, и все состояние управляется в центральном месте, специфичном для типа, это не путается. Посмотрите канал Flutter на Youtube, где они конвертируют приложение из Bloc в Provider и сколько кода / сложности вы получаете. youtube.com/watch?v=HrBiNHEqSYU   -  person skjagini    schedule 15.11.2019
comment
Это хороший ресурс! Я обязательно это проверю. Спасибо дружище! знак равно   -  person Steve Kim    schedule 15.11.2019
comment
Общее мнение о том, что поставщик не масштабируется, неверно. Практически любое популярное решение для управления состоянием в любом случае использует провайдера. Даже блок.   -  person Rémi Rousselet    schedule 15.11.2019
comment
Тем не менее, есть такие случаи, когда вам нужны StateFullWidgets. Например, вы добавляете анимацию, если у вас есть текстовые поля и т. Д. В таких случаях виджеты с отслеживанием состояния - лучший вариант.   -  person Milind Mevada    schedule 15.11.2019
comment
Полезное чтение для всех типов управления состоянием. flutter.dev/docs / development / data-and-backend / state-mgmt /   -  person TWL    schedule 28.01.2020


Ответы (3)


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

Но для реализации мне больше всего нравится flutter_bloc библиотека: https://pub.dev/packages/flutter_bloc

Он включает BlocProvider, который автоматически обрабатывает создание и удаление блоков.

Еще одна вещь, на которую следует обратить внимание, это то, что вам часто придется запускать событие в блоке, чтобы выполнить какое-либо действие, и StatefulWidget может быть полезным для запуска этого в методе initState.

Вы можете либо сказать в StatefulWidget:

initState(){
   _myBloc = SomeBloc()..add(SomeEvent());
}

// Then somewhere in your widget tree
BlocProvider<MyBloc>(
  create: (context) => _myBloc,
  builder: (context, state) {},
)

ИЛИ в вашем StatelessWidget:

BlocProvider<MyBloc>(
  create: (context) => MyBloc()..add(SomeEvent()),
  builder: (context, state) {},
)

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

person Jack    schedule 24.06.2020
comment
Спасибо! Хотел бы я найти этот ответ 3 часа назад ;-) - person Tom; 16.06.2021

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

  1. Во-первых, вы можете использовать виджет с отслеживанием состояния и закрыть потоки блока в методе удаления с отслеживанием состояния.

  2. Используя BlocProvider. В этом случае поставщик блоков - это только виджет с отслеживанием состояния. Он автоматически закрывает потоки. Затем вы можете использовать bloc с помощью BlocProvider в виджете без сохранения состояния.

Но это не значит, что нам не нужны виджеты с отслеживанием состояния. Например, виджеты с отслеживанием состояния важны в анимации. Анимация, ввод текста или любые локальные изменения в самом виджете не должны обрабатываться в блоке или другом управлении состоянием. это обязанность самого виджета.

person thisisyusub    schedule 19.02.2020
comment
но ввод текста может управляться блоком с потоками RX, которые они поддерживают, чтобы объединить два потока и некоторые полезные операции, но для анимации это должно быть разработано. - person A.K.J.94; 26.12.2020

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

person Krishna    schedule 19.02.2020