获取请求未与 Flutter 一起完成



我正在做一个 Flutter 应用程序,但是当我想发出一些 http 请求时,我发现了一个问题。问题是,当我想制作它时,我将函数定义为异步,并且在调用函数 http.get(( 之前编写 await,但函数没有执行,函数之后的代码也没有执行。 代码如下,未引发错误。

class db{
void get_basic() async{
String url = 'http://example.org/';
Response response = await get(url);
int statusCode = response.statusCode;
print("Listo");
print(statusCode);
}
}
Widget build(BuildContext context){
print("inicio database");
db database = db();
database.get_basic();
print("final database");
main_content main = main_content();
return Scaffold(
appBar: AppBar(
title: Text('Title),
),
body: main,
bottomNavigationBar: bottomNavBar(0,main.refresh),
);
}

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 [{}];
}
}
}

最新更新