Как проверить поток снимка ConnectionState of Firestore с StreamProvider? - PullRequest
0 голосов
/ 25 апреля 2020

Этот пример из документации cloud_firestore использует StreamBuilder и ConnectionState AsyncSnapshot для обработки потока в его различных состояниях. Есть ли аналогичный способ управления ConnectionState при доступе к потоку через StreamProvider вместо StreamBuilder? Каков наилучший способ избежать возврата в течение короткого времени null до тех пор, пока он фактически не получит документы из Firestore?

Вот пример из документа cloud_firestore с StreamBuilder:

    class BookList extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return StreamBuilder<QuerySnapshot>(
          stream: Firestore.instance.collection('books').snapshots(),
          builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
            if (snapshot.hasError)
              return new Text('Error: ${snapshot.error}');
            switch (snapshot.connectionState) {
              case ConnectionState.waiting: return new Text('Loading...');
              default:
                return new ListView(
                  children: snapshot.data.documents.map((DocumentSnapshot document) {
                    return new ListTile(
                      title: new Text(document['title']),
                      subtitle: new Text(document['author']),
                    );
                  }).toList(),
                );
            }
          },
        );
      }
    }

У меня довольно простой c поток:

    List<AuditMark> _auditMarksFromSnapshot(QuerySnapshot qs) {
      return qs.documents.map((DocumentSnapshot ds) {
        return AuditMark.fromSnapshot(ds);
      }).toList();
    }

    Stream<List<AuditMark>> get auditMarks {
      return Firestore.instance
          .collection('_auditMarks')
          .snapshots()
          .map(_auditMarksFromSnapshot);
    }

Доступ к нему осуществляется через StreamProvider (здесь опущены другие провайдеры):

    void main() async {
      runApp(MultiProvider(
        providers: [
          StreamProvider<List<AuditMark>>(
              create: (_) => DatabaseService().auditMarks, ),
        ],
        child: MyApp(),
      ));
    }

Я попытался каким-то образом преобразовать от QuerySnapshot до AsyncSnapshot<QuerySnapshot>, но, вероятно, ошиблись. Может, конечно, дать StreamProvider некоторые initialData примерно так - но это громоздко, подвержено ошибкам и, вероятно, дорого:

    initialData: <AuditMark>[
      AuditMark.fromSnapshot(await Firestore.instance
          .collection('_auditMarks')
          .orderBy('value')
          .getDocuments()
          .then((value) => value.documents.first))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...