вызов setState в прослушивателе блоков flutter

#flutter #dart #setstate #bloc

#flutter #dart #setstate #блок

Вопрос:

Я вызываю setState в flutter BlocListener. есть ли какие-либо проблемы с этим?

 ....
return BlocListener<XBloc, XState>(
      listener: (context, state) {
        if (state is XLoadedState) {
          setState(() {
            name = state.name;
          });
        }....
....
  

Комментарии:

1. Это не проблема, но зачем вам это делать? Зачем иметь состояние вне вашего блока, которое является копией вашего состояния внутри блока?

2. @nvoigt что, если у меня есть три отдельных списка на одном экране, и данные для этих трех списков будут доступны из одного источника (базы данных / службы). Мне нужно показать пустое состояние во время загрузки данных для этих списков. В этом случае не было бы разумно вызвать setState в BlocListener, поскольку необходимо обновить весь экран и будут показаны загруженные данные?

Ответ №1:

Это не проблема, но это своего рода бесполезный и анти-шаблон. И с помощью setState вы заставляете все перестраиваться, даже если в этом нет необходимости.

Вы могли бы просто обернуть виджет, который использует name BlocBuilder<XBloc,XState> , например, так:

 BlocBuilder<XBloc,XState>(
  builder: (context, state){
    if (state is XLoadedState){
      return Text(state.name);
    }else{
      //return something for when state.name is null, I guess
    }
  }
)
  

Подробнее об этом можно узнать здесь