#flutter #flutter-layout #flutter-futurebuilder
#флаттер #флаттер-макет #flutter-futurebuilder
Вопрос:
Scaffold(body: FutureBuilder(
future: fetchTracks(),
builder: (BuildContext context, AsyncSnapshot snapshot){
if(snapshot.hasData)
{
ListView.builder(
scrollDirection: Axis.vertical,
itemExtent: 130.0,
physics: AlwaysScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: trackes.length,
itemBuilder: (BuildContext context, int index) {
print("test");
return makeCard(snapshot.data[index]);
},
).build(context);
}
else
{
return Center(child: new CircularProgressIndicator());
}
} ));
Когда я вызываю этот каркас, будущая сборка вызовет мою будущую функцию fetchTracks() и получит данные в snapshot, но они не входят в функцию itemBuilder. Таким образом, futurebuilder возвращает NULL.
Пожалуйста, помогите мне решить. и заранее благодарю вас
Ответ №1:
Вы пропускаете return
перед ListView.builder
. Если вы не вернете его, он не будет его создавать.
Комментарии:
1. Большое вам спасибо.
Ответ №2:
FutureBuilder имеет разные состояния подключения к моментальному снимку, которые вы должны обрабатывать. Данные в потоке недоступны до тех пор, пока ConnectionState не станет равным done, а hasData — true.
_loadData(context)
{
showModalBottomSheet(
context: context,
builder: (BuildContext bc){
return FutureBuilder(
future: fetchTracks(),
builder: (BuildContext context, AsyncSnapshot<List<MyClass>> snapshot){
if (snapshot.connectionState!=ConnectionState.done)
{
return PleaseWaitWidget();
}
else if(snapshot.hasError)
{
DialogCaller.showErrorDialog(context,"future builder has an error").then((value){});
}
else if (snapshot.connectionState==ConnectionState.done)
{
if(snapshot.hasData){
List<Widget> list = snapshot.data.map((MyClass myClass){
return Card(
child:Wrap(children:<Widget>[
Row(children: [Text(myClass.field1)],),
]));}).toList();
return list;
}
}
});
});
}