Почему await не работает в случае конструктора? - PullRequest
0 голосов
/ 05 апреля 2020

Dart версия: 2.8.0

Я получаю это: Экземпляр 'Future<String>', хотя я использую await.

См. Код: from loading.dart (this это первая страница при запуске приложения)

 void setUpWorldTime() async {
    WorldTime worldTime = await WorldTime(location: 'Berlin', flag: 'germany.png', url: 'Asia/Kolkata');
    pri(worldTime.getTime());

  }

  @override
  void initState() {
    super.initState();
    setUpWorldTime();
  }

world_time.dart

import 'dart:convert';

import 'package:http/http.dart';

class WorldTime {
  String location;
  String time;
  String flag;
  String url;

  WorldTime({this.location, this.flag, this.url});

  Future<String> getTime() async {
    print('called getTime()');
    Response response = await get('http://worldtimeapi.org/api/timezone/$url');
    Map data = jsonDecode(response.body);

    String dateTime = data['datetime'];
    String offSet = data['utc_offset'].toString().substring(1, 3);
    DateTime now = DateTime.parse(dateTime);
    now = now.add(Duration(hours: int.parse(offSet)));
    time = now.toString();

    return Future.value(time);
  }
}

Сейчас я слежу за этим: https://www.youtube.com/watch?v=9lCQhwo8WT4&list=PL4cUxeGkcC9jLYyp2Aoh6hcWuxFDX6PBJ&index=28

В вышеприведенном уроке это работает, потому что в то время дротик 1.0 был новым

Проблема в моем коде заключается в следующем: pri(worldTime.getTime()); выполняется немедленно перед завершением API!

Также, пожалуйста, научите мне, как получить значение, которое я пытался вернуть так: return Future.value(time);

1 Ответ

1 голос
/ 05 апреля 2020

Конструктор может возвращать только экземпляр класса, который он создает (WorldTime). Конструкторы не могут быть асинхронными, потому что они должны были бы возвращать Future<WorldTime>, что не поддерживается.

В вашем случае вам просто нужно создать экземпляр WorldTime:

WorldTime worldTime = WorldTime(location: 'Berlin', flag: 'germany.png', url: 'Asia/Kolkata');

и затем вызвать асинхронный метод getTime на нем:

print(await worldTime.getTime());
...