Home > front end >  Async await does not wait for the output to return
Async await does not wait for the output to return

Time:10-18

I am making an bungalow reservation system with spring rest back end and flutter front end. In this I want to get a list of bungalows. So I decided to make a method to get the list of bungalows in a method using HttpService class that I made to handle the rest end points, That method is getBungalows() method. Then I called this method by overriding initstate(). But the problem is that before my initstate() is completed. my build method starts. To prove this I printed two lines 'print' and 'print build' as I thought I get 'print build' first. what am I doing wrong here. Please help.

Method to retrieve data from rest back end

When this happened I first checked this method but this works fine and return the desired result.

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';
 }
 }

Code of the HomeScreen

 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();
   
 }
}

Console Output

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

CodePudding user response:

It is behaving correctly, initState function is not async and method getBungalows() is called in parallel. You should either use setState in getBungalows, or add a listener, or use the then keyword, or use StreamBuilder.

Check this: https://stackoverflow.com/a/54647682/305135

  • Related