我正在做Flutter应用程序,但是当我想发出一些HTTP请求时发现了一个问题。问题是,当我要创建该函数时,我将函数定义为异步函数,并在调用函数http.get()之前编写了await,但是该函数未执行且该函数之后的代码也未执行。 代码在下面,并且不会引发任何错误。
import lxml
import lxml.etree as ET
for rra in rrd:
for database in rra:
for node in database:
if isinstance(node, lxml.etree._Comment):
print(node.text.strip())
2019-05-19 13:15:15 CDT / 1558289715
2019-05-19 13:15:30 CDT / 1558289730
2019-05-19 13:15:45 CDT / 1558289745
class db{
void get_basic() async{
String url = 'http://example.org/';
Response response = await get(url);
int statusCode = response.statusCode;
print("Listo");
print(statusCode);
}
}
答案 0 :(得分:0)
async
函数总是返回未来。
Future对象表示其返回值可能尚不可用的计算。当将来某个时候完成时,Future返回计算的值。期货通常用于潜在的冗长计算,例如I / O和与用户的交互。
async
函数将返回期货,这意味着它们将在将来执行。
因为dart使用单个线程来运行代码,这意味着当它到达await
而不是阻塞线程时,它将在函数调用后移至该线程并再次开始激活代码直到其空闲为止。
当线程完成所有同步代码后,它将返回到await
线,在那里开始兴奋。
构建完成后应调用get_basic()
代码。
如果您想在get_basic()
完成后重建小部件,则需要使用FutureBuilder
:
class _MyHomePageState extends State<MyHomePage> {
db database;
@override
void initState() {
super.initState();
database = db();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Title'),
),
body: FutureBuilder(
future: database.get_basic(),
builder: (context,snapshot){
if(snapshot.connectionState!=ConnectionState.done){
return Center(
child: Text('Loading...'),
);
} else {
if(snapshot.hasError){
return Center(
child: Text(snapshot.error.toString()),
);
}
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index){
return ListTile(title: Text(snapshot.data[index]['title']),);
},
);
}
},
),
);
}
}
class db{
Future get_basic() async{
try {
String url = 'https://jsonplaceholder.typicode.com/posts';
Response response = await get(url);
return jsonDecode(response.body);
} catch (e) {
print(e);
return [{}];
}
}
}