Как выполнить асинхронную задачу Future перед выполнением следующей инструкции Flutter
Я делаю вызов функции в моей базе данных, которая обновляет локальный объект после получения данных и занимает несколько минут.
Из-за асинхронной задачи программа переходит к следующей строке кода. к сожалению, мне нужен локальный объект, который обновляется с помощью асинхронного вызова для следующей строки кода.
Как я могу дождаться завершения моей асинхронной задачи, прежде чем будет выполнен следующий фрагмент кода? благодарю вас
редактировать: добавление кода для объяснения
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 ответа
Ты можешь использовать await
ключевое слово в async
функция.
например:
void someFunc() async {
await someFutureFunction();
// Your block of code
}
Здесь ваш блок кода не будет работать, пока someFutureFunction что-то не вернет.
Вы также можете использовать пользовательскую асинхронную функцию, как показано ниже:
(() async {
await restApis.getSearchedProducts(widget.sub_cats_id,widget.keyword).then((val) => setState(()
{
setState(() {
data = val["data"];
});
}));
})();
Это может помочь. В приведенном ниже примере кода есть две функции. Функция "Ниже" используется для загрузки ресурсов и возврата содержимого 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.
}
Надеюсь это поможет.