#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
должен вернуть aWidget
. В вашем коде он возвращает значение aWidget
только тогда, когда соединение ожидает. Он не возвращает виджет при извлечении данных. Попробуйте вернуть виджет ниже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 моих блока кода, ошибки возникнуть не должно