Я все еще пытаюсь понять, как будущее работает в дротике, я написал метод, который выбирает данные из API следующим образом:
Future<CountryData> getCountryData(String country) async {
CountryData data;
await apiService.getCountryData(country).then((country) {
data = country;
});
return data;
}
Но при вызове метода он не ждет выполнения завершить. Вот как вызывается метод:
Future<void> _updateData() async {
try {
final dataRepository =
Provider.of<DataRepository>(context, listen: false);
**final endpointcountrydata = await dataRepository.getCountryData("nigeria");**
final africaData = await dataRepository.getAfricaData();
setState(() {
_endpointsData = endpointsData;
_countryData = endpointcountrydata;
_africaModel = africaData;
});
} on SocketException catch (_) {
showAlertDialog(
context: context,
title: 'Connection Error',
content: 'Could not retrieve data. Please try again later.',
defaultActionText: 'OK',
);
} catch (_) {
showAlertDialog(
context: context,
title: 'Unknown Error',
content: 'Please contact support or try again later.',
defaultActionText: 'OK',
);
}
}
Оба метода (endpointcountrydata и africaData) не ждут завершения исключения.
Метод _updateData () вызывается в initState вот так:
@override
void initState() {
super.initState();
final dataRepository = Provider.of<DataRepository>(context, listen: false);
**dataRepository.getAfricaData().then((value){
print(value);
});**
_updateData();
}
Я даже пытался вызвать метод (getAfricaData ()) из initState, все еще не ожидая.
где я неправильно понял?
От Ответы ниже, я попробовал это:
Future<CountryData> getCountryData(String country) async {
CountryData data = await apiService.getCountryData(country);
return data;
}
Затем я установил bool примерно так:
bool _isFetchingData;
Вот как выглядит метод _updateData:
Future<void> _updateData() async {
try {
final dataRepository =
Provider.of<DataRepository>(context, listen: false);
final endpointcountrydata = await dataRepository.getCountryData("nigeria");
final endpointsData = await dataRepository.getAllEndpointsData();
final africaData = await dataRepository.getAfricaData();
setState(() {
_isFetchingData = true;
_endpointsData = endpointsData;
_countryData = endpointcountrydata;
_africaModel = africaData;
});
if(_countryData != null && _africaModel != null){
setState(() {
_isFetchingData = false;
});
}
} on SocketException catch (_) {
showAlertDialog(
context: context,
title: 'Connection Error',
content: 'Could not retrieve data. Please try again later.',
defaultActionText: 'OK',
);
} catch (_) {
showAlertDialog(
context: context,
title: 'Unknown Error',
content: 'Please contact support or try again later.',
defaultActionText: 'OK',
);
}
}
Тогда Initstate:
@override
void initState() {
super.initState();
final dataRepository = Provider.of<DataRepository>(context, listen: false);
_endpointsData = dataRepository.getAllEndpointsCachedData();
_updateData();
}
Тем не менее, все еще не ждет. Выдернуть мои волосы уже.