Функция сборки вернула null. Виджет-нарушение: BlocBuilder <NotificationBloc, NotificationState> в пакете flutter_bloc
Я новичок в flutter, а также во flutter_bloc, где я пытаюсь получить виджет в blocbuilder, но получаю сообщение "Функция сборки вернула null. Неприятный виджет:BlocBuilder. Функции сборки никогда не должны возвращать null". Ниже приведен код блока, а также нулевая ошибка с консоли.
Column(
children: <Widget>[
Container(
color: Colors.white,
child: BlocListener<NotificationBloc, NotificationState>(
listener: (context, state) {
},
child: BlocBuilder<NotificationBloc, NotificationState>(
builder: (context, state) {
if (state is NotificationLoadedState) {
return NotificationIconBuild();
}
},
),
),
)
],
)
Widget NotificationIconBuild() {
return Column(
children: <Widget>[
IconButton(
icon: Icon(Icons.notifications),
onPressed: () {},
),
IconButton(
icon: Icon(Icons.notifications),
onPressed: () {},
),])}
Ошибка из журнала консоли
I/flutter (13632): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (13632): The following assertion was thrown building BlocBuilder<NotificationBloc, NotificationState>(dirty,
I/flutter (13632): state: _BlocBuilderBaseState<NotificationBloc, NotificationState>#7fa62):
I/flutter (13632): A build function returned null.
I/flutter (13632): The offending widget is:
I/flutter (13632): BlocBuilder<NotificationBloc, NotificationState>
I/flutter (13632): Build functions must never return null.
I/flutter (13632): To return an empty space that causes the building widget to fill available room, return
I/flutter (13632): "Container()". To return an empty space that takes as little room as possible, return
I/flutter (13632): "Container(width: 0.0, height: 0.0)".
I/flutter (13632):
I/flutter (13632): The relevant error-causing widget was:
I/flutter (13632): BlocBuilder<NotificationBloc, NotificationState>
I/flutter (13632): file:///C:/Users/Nabil/AndroidStudioProjects/flutter_save/lib/home_page.dart:77:24
3 ответа
Это происходит потому, что вы указываете только один if
условие для вашего государства, которое NotificationLoadedState
. Ваш Блок, должно быть, пытался создать другое состояние, которое не указано, поэтому в результатеBlocBuilder
возвращает null.
Для быстрого исправления вы можете просто изменить свой BlocBuilder
к чему-то вроде этого пока.
child: BlocBuilder<NotificationBloc, NotificationState>(
builder: (context, state) {
if (state is NotificationLoadedState) {
return NotificationIconBuild();
} else {
return Container();,
}
},
),
Это происходит потому, что BlocBuilder требует возврата. Но вы определили возврат только тогда, когда условие истинно. Но когда условие ложно, оно вернет null. Вот почему он выдает эту ошибку. Поэтому вы должны добавить блок else или оператор возврата.
А в новой версии bloc, если вы хотите использовать BlocBuilder и BlocListener вместе, вы можете использовать виджет BlocConsumer.
Вы можете проверить это: Пример BlocConsumer
Одна вещь, которая действительно глупа, это то, что я использовал
BlocListener
вместо
BlocBuilder
, и выдает указанную выше ошибку, надеюсь, это кому-то поможет.