Как выполнить асинхронную задачу Future перед выполнением следующей инструкции Flutter - PullRequest
0 голосов
/ 26 сентября 2018

Я выполняю вызов функции в моей базе данных, которая обновляет локальный объект после получения данных и занимает несколько секунд.

Из-за задачи Async программа переходит к следующей строке кода.к сожалению, мне нужен локальный объект, который обновляется с помощью асинхронного вызова для следующей строки кода.

как я могу дождаться завершения моей асинхронной задачи перед выполнением следующего фрагмента кода?спасибо

изменить: добавив код для объяснения

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

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Это может помочь. В приведенном ниже примере кода есть две функции. Функция «Ниже» используется для загрузки ресурсов и возврата содержимого JSON.

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

другая функция будет использовать содержимое JSON, преобразовывать формат в модель и возвращать в класс.

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

Использование в классе, определило метод для вызова функции loadCountryCodes () из файла services.dart.

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. 
}

Надеюсь, это поможет.

0 голосов
/ 26 сентября 2018

Вы также можете использовать пользовательскую асинхронную функцию, как показано ниже:

(() async {
   await restApis.getSearchedProducts(widget.sub_cats_id,widget.keyword).then((val) => setState(()
   {
      setState(() {
         data = val["data"];
      });
   }));
})();
0 голосов
/ 26 сентября 2018

Вы можете использовать ключевое слово await в функции async.

например:

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

Здесь ваш блок кода не будет работать до тех пор, пока someFutureFunction вернет что-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...