Я новичок в паттерне 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!');
}
}
);
}
}