Являются ли виджеты реализующими BLoC обязательно StatefulWidgets? - PullRequest
0 голосов
/ 08 апреля 2019

Я новичок в паттерне BLoC, и возник вопрос, который я не смог найти в другом месте. Используя библиотеку flutter_bloc, у меня есть доступ к виджету BlocBuilder, который будет перестраиваться при каждом изменении состояния BLoC. Поскольку я обрабатываю состояние независимо от каркаса, необходимо ли объявлять родительский виджет (например, карту, содержащую данные из BLoC) как Stateful?

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

Я думаю, что я был бы на правильном пути, чтобы сказать, что без сохранения состояния это хорошо, если вам не нужно обновлять что-либо вне BlocBuilder, но вам потребуется Stateful, если вы добавите что-то вроде RefreshIndicator и должны будете реализовать логика для этого (и условно передать события в BLoC). Это правильно?

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

Вот упрощенная реализация без сохранения состояния, которая относится к моему проекту:


class WeatherCard extends StatelessWidget {

  /// You can assume that the following is happening:
  ///   1) There is a BlocProvider in the parent widget which
  ///      will implement this WeatherCard.
  ///
  ///   2) The WeatherLoaded state in the WeatherBloc provides an 
  ///      instance of a WeatherModel which contains all of the data
  ///      from a weather API.
  ///

  @override
  Widget build(BuildContext context) {
    return Card(
      child: BlocBuilder(
        bloc: BlocProvider.of<WeatherBloc>(context),
        builder: (BuildContext context, WeatherState state) {
          if (state is WeatherLoading) {
            return Text('Loading...');
          } else if (state is WeatherLoaded) {
            return Text(state.weatherModel.temp.toString());
          } else {
            return Text('Error!');
          }
        }
    );
  }
}

И реализация Stateful:


// You can make the same assumptions here as in the Stateless implementation.

class WeatherCard extends StatefulWidget {
  @override
  _WeatherCardState createState() => _WeatherCardState();
}

class _WeatherCardState extends State<WeatherCard> {
  @override
  Widget build(BuildContext context) {
    return Card(
      child: BlocBuilder(
        bloc: BlocProvider.of<WeatherBloc>(context),
        builder: (BuildContext context, WeatherState state) {
          if (state is WeatherLoading) {
            return Text('Loading...');
          } else if (state is WeatherLoaded) {
            return Text(state.weatherModel.temp.toString());
          } else {
            return Text('Error!');
          }
        }
    );
  }
}


1 Ответ

2 голосов
/ 08 апреля 2019

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

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

Также определенно возможно иметь несколько потоков, объявленных в блоке, и несколько StreamBuilders в пользовательском интерфейсе, прослушивающих один и тот же блок, хотя я не знаю, возможно ли это с библиотекой flutter_bloc.Похоже, вы ограничены одним потоком на блок, если вы используете flutter_bloc.Вместо этого вы также можете использовать стратегию / BlocProvider, описанную здесь .

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

...