在Flutter的initState中调用异步函数load(),执行方式是同步还是异步?
Flutter中initState内调用async函数的执行方式问题
已知Flutter的initState函数是同步执行的,那么在该函数内调用带有async修饰的load()函数,会以同步还是异步方式执行?如何验证这一点?
代码示例
class _ExampleState extends State<Example> { @override void initState() { super.initState(); load(); // 它会同步还是异步执行? } Future<void> load() async { debugPrint('loading'); await doIt(); } // 省略其他代码 }
结论与解释
load()函数是异步执行的,但函数内await关键字之前的同步代码会被立即执行:
- 带有
async修饰的函数,调用时会先同步执行到第一个await处,之后的代码会被挂起并加入事件队列,等待await绑定的Future完成后才会继续执行。 initState作为同步函数,调用load()时不会等待其全部执行完毕,在load()遇到await挂起后,initState会继续完成自身的同步流程。
验证方法
通过添加debugPrint语句观察输出顺序即可验证,修改后的示例代码如下:
class _ExampleState extends State<Example> { @override void initState() { super.initState(); debugPrint('initState start'); load(); debugPrint('initState end'); } Future<void> load() async { debugPrint('load: start'); await Future.delayed(const Duration(milliseconds: 100)); // 模拟耗时异步操作 debugPrint('load: after await'); } }
预期输出顺序:
initState start load: start initState end load: after await
从输出能清晰看到:load()中await之前的代码和initState同步执行,而await之后的代码则在initState完成后才执行,证明了load()整体是异步执行的特性。
附:我一直觉得奇怪,问一些简单问题总能很快得到大量回答,而问这类不那么直观的问题却容易被忽视,因为大家不太明白问题的核心所在...
内容的提问来源于stack exchange,提问作者rozerro
相关产品推荐
相关产品推荐

