Мне нужно некоторое руководство в будущих асинхронных вызовах с флаттером и дротиком, иногда вещи случаются не в порядке - PullRequest
1 голос
/ 17 апреля 2020

Следующий код работает нормально, потому что он возвращает только простой список, но в некоторых случаях, когда мне нужно делать вложенные вызовы Firebase, я не могу заставить вещи происходить в правильном порядке, и основной оператор return оказывается неполным. Что я могу сделать, чтобы улучшить мои будущие асинхронные вызовы?

Future<List<MyNotification>> getNotifications() async {
    var uid = await FirebaseAuth.instance.currentUser();

    List<MyNotification> tempNots = await Firestore.instance
        .collection("notifications")
        .where("targetUsers", arrayContains: uid.uid)
        .getDocuments()
        .then((x) {
      List<MyNotification> tempTempNots = [];
      if (x.documents.isNotEmpty) {
        for (var not in x.documents) {
          tempTempNots.add(MyNotification.fromMap(not));
        }
      }
      return tempTempNots = [];
    });
    return tempNots;
  }

1 Ответ

2 голосов
/ 17 апреля 2020

Самое главное; не используйте then внутри ваших асин c функций. Я изменил ваш код следующим образом:

Future<List<MyNotification>> getNotifications() async {
  // Using the type definition is better.
  FirebaseUser user = await FirebaseAuth.instance.currentUser();

  // The return type of getDocuments is a QuerySnapshot
  QuerySnapshot querySnapshot = await Firestore.instance
      .collection("notifications")
      .where("targetUsers", arrayContains: user.uid)
      .getDocuments();

  List<MyNotification> tempTempNots = [];

  if (querySnapshot.documents.isNotEmpty) {
    for (DocumentSnapshot not in querySnapshot.documents) {
      tempTempNots.add(MyNotification.fromMap(not));
    }
  }
 return tempTempNots;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...