Сначала вы должны понять, что такое Future
операции (Future
функция в вашем случае). Будущие операции - это операции, которые требуют времени для выполнения и возвращают результат позже. Чтобы решить эту проблему, мы используем Асинхронные функции .
Асинхронные функции позволяют вашей программе продолжать другие операции во время выполнения текущей операции. Dart использует Future
объекты (Futures) для представления результатов асинхронных операций. Для обработки этих операций мы можем использовать async / await , но невозможно интегрировать async и await в виджеты. Так что обрабатывать фьючерсы в виджетах довольно сложно. Чтобы решить эту проблему, флаттер предоставил виджет с именем FutureBuilder
.
В FutureBuilder
он вызывает функцию Future , чтобы дождаться результата, и как только он выдаст результат, онвызывает функцию builder , где мы создаем виджет.
Вот как это должно быть:
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
List allItems = new List();
Future<List> pegaDados() async{
var items = await geraCardapio(); // TODO: Add this function to this class
for (var i = 0; i < items.length; i++) {
print((items[i].toMap()));
allItems.add(items[i].toMap());
}
return items;
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(title: Text('Demo')),
body: FutureBuilder(
future: pegaDados(),
builder: (context, snapshot){
if(snapshot.connectionState == ConnectionState.done){
return Container(
child: ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
return ListTile(
leading: Image.asset("assets/"+ snapshot.data[index]['imagem'], fit: BoxFit.contain,),
title: Text(snapshot.data[index]['pedido']),
trailing: Text(snapshot.data[index]['valor']),
);
},
),
);
}
else if(snapshot.hasError){
throw snapshot.error;
}
else{
return Center(child: CircularProgressIndicator());
}
},
),
);
}
}
Вот ссылка накороткое видео, которое кратко объяснит FutureBuilder
.