flutter 使用async await需要hotreload,但使用.then则不需要

zi8p0yeb  于 2023-01-18  发布在  Flutter
关注(0)|答案(1)|浏览(167)

有人能帮我理解这段代码吗:

String? userName = "";   
 String? userEmail = ""; 
 AuthService authService = AuthService();

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    gettingUserData();
  }

定义gettingUserData()时,使用异步,await需要hotreload来显示电子邮件

gettingUserData() async {     
setState(() async {       
userName = await HelperFunction.getUsername();       
userEmail = await HelperFunction.getUseremail();     
});   
}

但是用.则定义它不需要热重

gettingUserData() {
    HelperFunction.getUseremail().then((value) {
      setState(() {
        userEmail = value;
      });
    });

    HelperFunction.getUsername().then((value) {
      setState(() {
        userName = value;
      });
    });
  }

有谁能帮我理解这是为什么吗?

slhcrj9b

slhcrj9b1#

这两个版本不等同。Future.then版本在每个Future完成 * 之后 * 调用setState
await版本使用异步回调调用setState,这是setState所不期望的。由于setState expects a VoidCallback argument,它期望其回调同步完成,因此它不会被await编辑。因此,setState在等待Future完成之前 * 立即 * 执行并返回。
纠正await版本的一种方法是 * 先 * 将await修改为Future,然后调用setState

Future<void> gettingUserData() async {     
  var userName = await HelperFunction.getUsername();
  var userEmail = await HelperFunction.getUseremail();
  setState(() {
    this.userName = userName;
    this.userEmail = userEmail;
  });
}

相关问题