【问题标题】:Async await does not wait for the output to return异步等待不等待输出返回
【发布时间】:2021-10-13 21:33:41
【问题描述】:

我正在制作一个带有弹簧休息后端和颤振前端的平房预订系统。 在这个我想得到一个平房列表。 所以我决定创建一个方法来获取平房列表,该方法使用我为处理其余端点而创建的 HttpService 类,该方法是 getBungalows() 方法。 然后我通过重写 initstate() 来调用这个方法。 但问题是在我的 initstate() 完成之前。我的构建方法开始。 为了证明这一点,我打印了两行“打印”和“打印构建”,因为我认为我首先得到了“打印构建”。我在这里做错了什么。请帮忙。

从rest后端获取数据的方法

发生这种情况时,我首先检查了这个方法,但它工作正常并返回所需的结果。

Future<List<Bungalow>> getBungalows() async {
  Uri uri = Uri.parse('$url/bungalows/');
  http.Response response = await http.get(uri);

 if (response.statusCode == 200) {
   List<Bungalow> bungalows = List<Bungalow>.from(
      json.decode(response.body).map((x) => Bungalow.fromJson(x)));
   // print(bungalows.first.address + 'asafafasfafdfgfgarfgargafvfrvaerg');
   return bungalows;
 } else {
   throw 'Unable to retrieve data';
 }
 }

主屏幕代码

 class _HomeScreenState extends State<HomeScreen> {
   HttpService httpService = HttpService();
   late List<Bungalow> bungalows;
   bool isLoggedIn = false;
   User? user;

   void getBungalows() async {
     bungalows = await httpService.getBungalows();
     print('done');
   }

  @override
  Widget build(BuildContext context) {
   if (widget.user != null) {
   isLoggedIn = true;
   user = widget.user;
   }
   print('done build');
   return Scaffold(
   backgroundColor: Colors.white,
   body: Column(
    children: [
      Text(isLoggedIn ? user!.userDetail.username : 'No login'),
      // TextButton(
      //     onPressed: () {
      //       setState(() {
      //         getBungalows();
      //         print(bungalows.first.address);
      //       });
      //     },
      //     child: Text('click'))
     ],
  ),
);
}

@override
 void initState() {
   getBungalows();
   
 }
}

控制台输出

I/flutter (22248): done build
I/flutter (22248): done

【问题讨论】:

  • 你没有在 initState 中等待所以你期望什么?
  • 结果是我对现在代码的期望。
  • 我已经在 getBungalow() 方法中完成了等待。
  • setState 拿到后带平房
  • @MarianoZorrilla 我必须做什么才能先完成打印然后完成构建。

标签: android flutter asynchronous mobile async-await


【解决方案1】:

它的行为正确,initState 函数不是异步的,并且方法 getBungalows() 被并行调用。 您应该在 getBungalows 中使用 setState,或者添加一个监听器,或者使用 then 关键字,或者使用 StreamBuilder。

检查这个:https://stackoverflow.com/a/54647682/305135

【讨论】:

  • 你的意思是这样的?
  • void getBungalows() async { var list = await httpService.getBungalows(); setState(() { bungalows = list; }); }
  • 我试过上面的方法,结果是一样的
  • 创建一个 DartPad 并分享,也许我可以帮忙。
猜你喜欢
  • 2020-03-13
  • 2021-06-30
  • 2021-11-01
  • 2021-12-01
  • 2016-07-07
  • 2016-03-25
  • 2017-10-09
相关资源
最近更新 更多