Функция сборки возвратила ноль, виджет-нарушитель: BlocBuilder в пакете flutter_blo c - PullRequest
0 голосов
/ 19 января 2020

Я новичок во флаттере, а также во flutter_blo c, где я пытаюсь получить виджет в blocbuilder, но получаю "Функция сборки вернула ноль. Видящий сбой виджет: BlocBuilder. Функции сборки никогда не должны возвращаться значение NULL." Ниже приведен код blo c, а также нулевая ошибка с консоли.

        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

Ответы [ 2 ]

1 голос
/ 19 января 2020

Это происходит потому, что вы указываете только одно if условие для вашего состояния, равное NotificationLoadedState. Ваш Blo c, должно быть, пытался построить другое состояние, которое не указано, поэтому в результате BlocBuilder возвращает ноль.

Для быстрого исправления, вы можете просто изменить BlocBuilder на что-то подобное сейчас.

                child: BlocBuilder<NotificationBloc, NotificationState>(
                  builder: (context, state) {
                    if (state is NotificationLoadedState) {
                      return NotificationIconBuild();
                    } else {
                      return Container();,
                    }
                  },
                ),
0 голосов
/ 27 января 2020

Это происходит потому, что BlocBuilder требует возврата. Но вы определили только возврат, когда условие верно. Но когда условие ложно, оно вернет ноль. Вот почему это дает эту ошибку. Таким образом, вы должны добавить else block или return оператор.

А в новой версии blo c, если вы хотите использовать BlocBuilder и BlocListener вместе, вы можете использовать BlocConsumer виджет.

Вы можете проверить это: Пример BlocConsumer

...