Значение типа Future <Class>нельзя присвоить объекту типа Class - PullRequest
0 голосов
/ 31 октября 2019

Я хочу иметь возможность вернуть класс, в моем случае имя класса Car. Я хочу вернуть его от моего провайдера на мой экран. В моем провайдере у меня есть этот метод, который должен возвращать объект класса Car provider.dart

Future<Car> fetchCarById(int carId) async {
  final url =
      'demourl';
  try {
    final response = await http.get(url);
    final extractedCar = json.decode(response.body);
    if (extractedCar == null) {
      return null;
    }
    final Car selectedCar = Car(
        id: extractedCar['ID'],
        brand: extractedCar['Brand'],
        model: extractedCar['Model'],
    final List<Car> loadedProducts = [];
    loadedProducts.add(selectedCar);
    _items = loadedProducts;
    notifyListeners();
    return selectedCar;
  } catch (error) {
    throw error;
  }
}

Но вместо этого я получаю эту ошибку

Значение типа Futureневозможно присвоить объекту типа Car

Когда я пытаюсь получить объект Car с моего экрана screen.dart

final Car car = Cars(auth.token).fetchCarById(carId);

Я увидел, что это можно сделать с помощью FutureBuilder, но есть ли упрощенный способ сделать это? Я не хочу трогать мой код в файле screen.dart. Возможно ли это?

1 Ответ

2 голосов
/ 31 октября 2019

Ваш метод помечен как async и поэтому не возвращает Car, но Future<Car>. В вашем назначении вы установили тип Car, и возникает ошибка, поскольку существует несоответствие типов между типом переменной и возвращаемым значением вызываемого метода.

Возвращенное значение Future указываетчто значение должным образом не готово, и вам нужно ждать значения. Это можно сделать в асинхронном методе, используя ключевое слово await:

Future<void> method() async {
  final Car car = await Cars(auth.token).fetchCarById(carId);
}

Или вы можете добавить метод обратного вызова, который вызывается, когда значение готово:

void method() {
  final Car car =
      Cars(auth.token).fetchCarById(carId).then((car) => print(car));
}

Я рекомендую вам прочитать документацию по асинхронному программированию в Dart: https://dart.dev/codelabs/async-await

...