Tegster007
Tegster007

Reputation: 91

How to finish the async Future task before executing the next instruction Flutter

I make a function call to my database, which updates a local object after getting data and takes a few moments.

Because of the Async task, the program moves to the next line of code. unfortunately I need the local object that gets updated with the async call for the next line of code.

how can I wait for my async task to finish before the next piece of code is executed? thank you

edit: adding code to explain

updateUser() {
return FutureBuilder(
        future: updateUserData(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (snapshot.connectionState != ConnectionState.done) {
            return Text("hello not");
          } else {
            return Text('Hello!');
          }
        },

);}

  @override
  Widget build(BuildContext context) {
    switch (_authStatus) {
      case AuthStatus.notSignedIn:
        return new LoginPage(
          auth: auth,
          CurrentUser: CurrentUser,
          onSignedIn: _signedIn,
        );
      case AuthStatus.signedIn:
        {
          updateUser(); //THIS TAKES A COUPLE SECONDS TO FINISH BUT I NEED TO SEND IT TO THE NEXT PAGE

            return new HomePage(
              auth: auth,
              CurrentUser: CurrentUser,
              onSignedOut: _signedOut,
            );
          }
        }
    }
  }

Upvotes: 3

Views: 4538

Answers (3)

Rahul Mishra
Rahul Mishra

Reputation: 4573

You can also use with custom async function like below example:

(() async {
   await restApis.getSearchedProducts(widget.sub_cats_id,widget.keyword).then((val) => setState(()
   {
      setState(() {
         data = val["data"];
      });
   }));
})();

Upvotes: 1

Nagendra Badiganti
Nagendra Badiganti

Reputation: 2269

This might help, The below sample code has two functions, Below function is used to load the assets and return the JSON content.

Future<String> _loadCountriesAsset() async {
  return await rootBundle.loadString('assets/country_codes.json');
}

the other function will use the JSON content and convert the format to model and return to the class.

Future<List<CountryCode>> loadCountryCodes() async {
  String jsonString = await _loadCountriesAsset();
  final jsonResponse = json.decode(jsonString);
  // print(jsonResponse);

  CountriesCodeList countriesCodeList =
      new CountriesCodeList.fromJson(jsonResponse);
  // print("length " + countriesCodeList.codes.length.toString());
  return countriesCodeList.codes;
}

Usage in the class, defined a method to call the loadCountryCodes() function from services.dart file.

Future getCountryCodes() async {
var countryCodesList = await loadCountryCodes();

print("**** length " + countryCodesList.length.toString());
// Perform the operations, or update to the UI or server. It should be same for API call as well. 
}

Hope this helps.

Upvotes: 0

Arnold Parge
Arnold Parge

Reputation: 6867

You can use await keyword in async function.

eg:

  void someFunc() async {
    await someFutureFunction();
    // Your block of code
  }

Here your block of code wont run until someFutureFunction returns something.

Upvotes: 4

Related Questions