Возврат будущего вместо объекта

#flutter #dart

#трепетание #dart

Вопрос:

Я пытаюсь понять, почему IDE не жалуется на изменение типа с Object на Future в этой функции:

 class PromotionRepository implements IPromotionRepository {
  final CollectionReference collection =
      FirebaseFirestore.instance.collection('promotions');

  Future<List<Promotion>> getAllPromotions() async {
    QuerySnapshot query = await collection.get();
    List<Promotion> promotions =
        query.docs.map((doc) => Promotion.fromFirestore(doc)).toList();
    return promotions;
  }
}
 

В этом случае я возвращаю List<Promotion> , а не Future<List<Promotion> , но в сигнатуре метода я возвращаю тип, определенный как Feature...

Нет никакой разницы, если я перейду на just List<Promotion> . В обоих случаях это работает одинаково.

Ответ №1:

Вы возвращаетесь List<Promotion> , но внутри асинхронного метода. Все, что возвращается в асинхронных методах, является a Future .

Вы даже объявили тип перед именем метода.

Здесь у вас есть несколько простых примеров. Обратите внимание, что true возвращается везде, но в разных типах методов.

 void main() {
  print(streamTest().runtimeType); // result: Stream<bool>
  print(asyncTest().runtimeType); // result: Future<bool>
  print(syncTest().runtimeType); // esult bool
}

Stream<bool> streamTest() async* {
  yield true;
}

Future<bool> asyncTest() async => true;

bool syncTest() => true;