Изменения Firestore не синхронизируются с построителем потоков - PullRequest
0 голосов
/ 11 июля 2020

Когда я обновляю базу данных в консоли или приложении, изменения не синхронизируются в приложении. Я думал, что это из-за настроек orderBy и индексации, но их комментирование не помогло. Что не так с моим кодом? Как настроить автосинхронизацию c?

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      drawer: DrawerMenu(),
      appBar: AppBar(
        title: Text('Заявки'),
      ),
      body: StreamBuilder<QuerySnapshot>(
        stream: Firestore.instance
            .collection('orders')
            .where('companyId', isEqualTo: globals.companyId)
            // .orderBy('dateAdded', descending: true)
            // .orderBy('statusId')
            .snapshots(),
        builder: (context, snapshot) {
          if (snapshot.hasError) {
            return Text('Error: ${snapshot.error}');
          }
          switch (snapshot.connectionState) {
            case ConnectionState.waiting:
              return LoadingScreen();
            default:
              return ListView.builder(
                  itemCount: snapshot.data.documents.length,
                  itemBuilder: (context, index) => GestureDetector(
                      onTap: () => Navigator.push(
                          context,
                          MaterialPageRoute(
                            builder: (context) => Items(
                              order: snapshot.data.documents[index],
                            ),
                          )),
                      child: OrderCard(
                        order: snapshot.data.documents[index],
                      )));
          }
        },
      ),
    );
  }

1 Ответ

1 голос
/ 11 июля 2020

Это потому, что вы только один раз получаете снимок в виде потока, но чтобы получить фактические изменения при изменении в консоли или приложении, вам необходимо оформить подписку на поток. Вам необходимо прослушать поток данных, чтобы получать уведомления, когда что-то изменится.

Также вы можете захотеть разделить logi c firebase, это проще.

Например:

Создание контроллера потока:

final StreamController<DataType> _streamController = StreamController<DataType>();

Прослушивание данных firebase и добавление их в поток:

Firestore.instance
        .collection('orders')
        .where('companyId', isEqualTo: globals.companyId)
        .snapshots().listen((DocumentSnapshot snapShot){
          _streamController.add(snapShot.documents);
        });

Теперь вы можете прослушивать поток из контроллера потока:

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