Почему Flutter Future не ждет - PullRequest
0 голосов
/ 22 апреля 2020

Я все еще пытаюсь понять, как будущее работает в дротике, я написал метод, который выбирает данные из 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();
  }

Тем не менее, все еще не ждет. Выдернуть мои волосы уже.

1 Ответ

0 голосов
/ 22 апреля 2020

Вы не должны возвращать будущее, если вы возвращаете фактический объект

CountryData getCountryData(String country) async {
    CountryData data = await apiService.getCountryData(country);
      return data;
  } 

Тип возврата - Future<CountryData>, измените его на CountryData

...