我正在学习Dart中的异步和未来函数,但我感到困惑,因为我仍然不明白print(“object”)是如何在getData()函数之前编译的,因为传统上,一旦前一行或函数完全编译/执行,编译器就会读取下一行。如果我犯了错误,请纠正我,我是noob tbh
import 'package:flutter/material.dart';
class Loading extends StatefulWidget {
const Loading({super.key});
@override
State\<Loading\> createState() =\> \_LoadingState();
}
class \_LoadingState extends State\<Loading\> {
void getdata() async {
String parth = await Future.delayed(Duration(seconds: 3), () {
return 'parth';
});
print('Hey');
print(parth);
}
@override
int count = 0;
void initState() {
// TODO: implement initState
super.initState();
getdata();
print('object');
}
@override
Widget build(BuildContext context) {
// print(' Setstae vala + $count');
return Scaffold(
appBar: AppBar(
title: Text('Loading'),
),
body: ElevatedButton(
onPressed: () {
setState(() {
count++;
});
},
child: Text('$count')),
);
}
}
2条答案
按热度按时间fiei3ece1#
您的输出应如下所示:
1.客体
1.喂
1.帕斯
因为传统上,一旦前一行或函数被完全编译/执行,编译器就会读取下一行
正常情况下,是的。但是由于在本例中使用了async关键字,所以它的工作方式略有不同。
这里发生了什么:
你首先在initState中调用getData。在getData中你有一个延迟的future,你用keywoard await等待它。所以它等待3秒直到你把'parth'作为一个字符串返回。然而,同时,它继续在initState中运行以返回'object'。
wdebmtf22#
getdata
是一个异步方法,您需要返回Future<void>
以等待。现在
initState()
不能是异步的,您可以创建另一个方法来等待并将其放置在此处。并将
newMethod()
放入initState中。也可以使用
.then