我正在尝试使用Orders
显示实时http json数据mtgCardNames
。数据似乎已成功传递(它们已正确打印),但不知何故它们没有显示在屏幕上。为了了解这种情况,我尝试显示一些其他数据(搜索buildResults
和query
),它们按预期显示在屏幕上。
为什么会这样?
我重写了所有必需的4种方法,但在这里只是简单地粘贴testList
。
buildResults
此刻,http数据不是基于查询,而是硬编码的url,而是实时数据。我在Ubuntu上运行,但我的医生似乎没有问题。
任何建议或帮助都非常感谢!
答案 0 :(得分:1)
问题是网络调用getData()
是异步执行的:
1)您致电getData()
2)同步代码继续执行:return Column(...)
仍然为空时调用mtgCardNames
3)您在屏幕上看到空白列
4)网络通话结束,执行then(...)
,并填充mtgCardNames
要实际显示带有网络调用数据的列,您应该在加载时返回一个小部件,然后再返回一个。一种方法是使用FutureBuilder
。基本思想是
@override
Widget buildResults(BuildContext context) {
GetHTTP getHTTP = GetHTTP();
return FutureBuilder<List<MTGCard>>(
future: getHTTP.getData(),
builder: (context, snapshot) {
if (!snapshot.hasData)
return Text('Loading...');
return Column(
children: <Widget>[
Text(query),
for (MTGCard c in snapshot.data)
Text(c.name),
],
);
},
);
}
但是还有更多细节。例如。将网络调用放入build()方法中不是一个好主意。如果网络调用失败,您还可以显示一些错误窗口小部件。查看tutorial
中的详细信息