#flutter
Вопрос:
Я использую FutureBuilder для отображения значений из базы данных в графическом интерфейсе. Проблема в том, что я получаю нулевую ошибку до того, как будут показаны значения. Я пытался решить эту проблему с помощью вызова ConnectionState, но это не работает.
Вот мой код до сих пор:
return FutureBuilder<TerminList>(
future: mainTermine,
builder: (context, snapshot) {
print(snapshot.data.termine[0].postTitle);
switch (snapshot.connectionState) {
case ConnectionState.none:
return Text('No Connection');
case ConnectionState.active:
case ConnectionState.waiting:
return AppProgressIndicator();
case ConnectionState.done:
return ListView.builder(
itemCount: snapshot.data.termine.length,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
return Container(
margin: EdgeInsets.all(10),
decoration: BoxDecoration(),
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
),
elevation: 5,
color: Colors.white,
child: GroovinExpansionTile(
boxDecoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
),
backgroundColor: Colors.white,
leading: Text(
snapshot.data.termine[index].metaValue,
style: TextStyles.placeholder,
),
title: Text(
snapshot.data.termine[index].postTitle,
style: TextStyles.body,
),
children: [
Column(
children: [
Padding(
padding: EdgeInsets.all(10),
child: AppDivider(),
),
],
)
],
),
),
);
});
return null;
default:
return Text('none');
}
});
Комментарии:
1. Удалите эту строку печати(снимок.данные.окончание[0].Заголовок);
2. Большое спасибо!
Ответ №1:
Во-первых, вам не нужны нижеприведенные строки, потому что, используя переключатель, вы рассмотрели все сценарии.
return null;
default:
return Text('none');
и удалите нижеприведенную строку, потому что вы пытаетесь получить данные до завершения будущих процессов.
print(snapshot.data.termine[0].postTitle);
Комментарии:
1. спасибо вам за вашу помощь 🙂
Ответ №2:
Я бы использовал snapshot.hasError
и snapshot.hasData
вместо snapshot.connectionState
этого . Это могло бы выглядеть примерно так. (Не уверен, правильно ли я поставил все скобки.)
return FutureBuilder<TerminList>(
future: mainTermine,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text('error while fetching data');
}
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data.termine.length,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
return Container(
margin: EdgeInsets.all(10),
decoration: BoxDecoration(),
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
),
elevation: 5,
color: Colors.white,
child: GroovinExpansionTile(
boxDecoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
),
backgroundColor: Colors.white,
leading: Text(
snapshot.data.termine[index].metaValue,
style: TextStyles.placeholder,
),
title: Text(
snapshot.data.termine[index].postTitle,
style: TextStyles.body,
),
children: [
Column(
children: [
Padding(
padding: EdgeInsets.all(10),
child: AppDivider(),
),
],
)
],
),
),
);
}
);
}
return AppProgressIndicator();
}
);