Метод построения виджета, возвращающий ошибку — Эта функция имеет тип возврата «Виджет», но не заканчивается оператором return

#flutter #dart

Вопрос:

Я пытаюсь выяснить, что не так с приведенным ниже кодом в течение некоторого времени. В нем говорится, что эта функция имеет возвращаемый тип «Виджет», но не заканчивается оператором return.

   @override
  Widget build(BuildContext context) {
    return FutureBuilder<bool>(
        initialData: false,
        future: Authentication().fetchAuthSession(),
        builder: (context, future) {
          switch (future.connectionState) {
            case ConnectionState.waiting :
              {
                return CircularProgressIndicator();
              }
            case ConnectionState.done :
              {
                if (future.data == false) {
                  print('Done');  
                } else print('Not Done');
                break;
              }
          }
        }
    );
  }
 

РЕДАКТИРОВАТЬ — после применения элементов, упомянутых в ответе. Я все еще получаю ту же ошибку

   @override
  Widget build(BuildContext context) {
    return FutureBuilder<bool>(
        initialData: false,
        future: Authentication().fetchAuthSession(),
        builder: (context, future) {
          switch (future.connectionState) {
            case ConnectionState.waiting :
              {
                return CircularProgressIndicator();
              }
            case ConnectionState.done :
              {
                if (future.data == false) {
                  print('Done');
                } else {
                  print('Not Done');
                  return Container();
                }
              }
            default :
              {
                return Container();
              }
          }
        }
    );
  }
 

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

1. Вход builder FutureBuilder должен вернуть a Widget . В вашем коде он возвращает значение a Widget только тогда, когда соединение ожидает. Он не возвращает виджет при извлечении данных. Попробуйте вернуть виджет ниже switch (...) {...} <insert return widget here> .

2. Спасибо @rickimaru, не могли бы вы, пожалуйста, проверить мой оригинальный пост

Ответ №1:

Здесь вы должны учитывать две вещи, чтобы внутри конструктора код гарантировал, что в каждом блоке возвращается какой-то виджет.

Сначала укажите регистр по умолчанию в инструкции switch.

   switch (future.connectionState) {
      case ConnectionState.waiting:
      {
        return CircularProgressIndicator();
      }
      default:
      {
        return Container();
      }
  }
 

Во-вторых, вместо того, чтобы ломаться, вернитесь с каким-нибудь виджетом во всех случаях.

 case ConnectionState.done:
  {
    if (future.data == false) {
      print('Done');
    } else
      print('Not Done');
    return Container();   // Just an empty container widget for example
  }
default:
 {
   return Container();
 }
 

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

1. Спасибо, Абдул. Я все еще получаю ту же ошибку, я изменил свой исходный пост с вашим ответом. пожалуйста, проверьте.

Ответ №2:

Как вы можете видеть из сообщения об ошибке, поскольку builder ожидается, что виджет будет возвращен, ваш switch / case блок должен возвращать виджет в каждом конкретном случае. Используйте default ключевое слово также в том случае, если ни одно условие не выполняется. Вы можете это сделать:

 builder: (context, future) {
  switch (future.connectionState) { 
    case ConnectionState.done:  // The bracelet is not needed for case
        if (future.data == false) {
          print('Done');
        } else {
          print('Not Done');
        }
        return Container(); // return a Widget here, for example Container()
    case ConnectionState.waiting:
    default:     
        return CircularProgressIndicator();
  }
 

введите описание изображения здесь

Код становится чище, хотя, если вы используете простой оператор if/ else с hasData :

 builder: (context, future) {
  if (!future.hasData) return CircularProgressIndicator();
  if (future.data) {
    print('Done');
  } else {
    print('Not Done');
  }
  return Container(); // return a Widget here, for example Container()
}
 

введите описание изображения здесь

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

1. Я скопировал ваш код с помощью оператора if, но все равно получаю ту же ошибку

2. @Sumchans Код, которым вы обновили свой вопрос, не возвращает виджет внутри if (future.data == false) , который вызывает ошибку. Кстати, вам не нужно использовать браслет для case . Я обновил свой ответ картинкой, используя 2 моих блока кода, ошибки возникнуть не должно