gpt4 book ai didi

asynchronous - Flutter 如何从异步函数中获取数据

转载 作者:行者123 更新时间:2023-12-04 04:49:49 24 4
gpt4 key购买 nike

我在处理这个问题时遇到了极大的困难。我调用了一个异步函数,它将从 SQLite 获取一些信息,但我似乎无法获取它。它只是呈现一个空屏幕,其中应该是一个 ListView 。

List allItems = new List();


Future<void> pegaDados() async{
var itens = await geraCardapio();

for (var i = 0; i < itens.length; i++) {
print((itens[i].toMap()));
allItems.add(itens[i].toMap());
}

}

print(pegaDados());


return ListView.builder(
itemCount: allItems.length,
itemBuilder: (context, index) {
return ListTile(
leading: Image.asset("assets/"+ allItems[index]['imagem'], fit: BoxFit.contain,),
title: Text(allItems[index]['pedido']),
trailing: Text(allItems[index]['valor']),
);
},
);

非常感谢。

我设法得到了解决方案,感谢回答问题的两个人(使用这两种解决方案我设法得到了这个小弗兰肯斯坦)
    Future<dynamic> pegaDados() async{
var allItems = await geraCardapio();

return allItems.map((allItems) => allItems.toMap());
}



return FutureBuilder(
future: pegaDados(),
builder: (context, snapshot){
if(snapshot.connectionState == ConnectionState.done){
print(snapshot.data);
var objeto = [];

for (var i in snapshot.data) {
objeto.add(i);
}

print(objeto);
return Container(
child: ListView.builder(
itemCount: objeto.length,
itemBuilder: (context, index) {
return ListTile(
leading: Image.asset("assets/"+ objeto[index]['imagem'], fit: BoxFit.contain,),
title: Text(objeto[index]['pedido']),
trailing: Text(objeto[index]['valor'].toString()),
);
},
),
);
}
else if(snapshot.hasError){
throw snapshot.error;
}
else{
return Center(child: CircularProgressIndicator());
}
},
);

感谢 Mohammad Assem NasserEliya Cohen为了帮助!

最佳答案

你应该先了解一下什么是Future操作(在您的情况下为 Future 函数)。 future 操作是需要时间执行并稍后返回结果的操作。为了处理这个问题,我们使用 异步函数 .

异步函数 让您的程序在执行当前操作的同时继续其他操作。 Dart 使用 Future对象( future )来表示 的结果异步 操作。为了处理这些操作,我们可以使用 异步/等待 ,但不可能在小部件上集成异步和等待。所以在小部件中处理 future 是相当棘手的。为了解决这个问题,flutter 提供了一个名为 FutureBuilder 的小部件。 .

FutureBuilder ,它调用 future 功能 等待结果,一旦产生结果,它就会调用 生成器函数 我们在这里构建小部件。

应该是这样的:

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());
}
},
),
);
}
}

这是 link到一个简短的视频,将解释 FutureBuilder以简洁的方式。

关于asynchronous - Flutter 如何从异步函数中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58721400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com