Как динамически обновлять ListView, когда пользователь выбирает другую дату? - PullRequest
0 голосов
/ 19 марта 2020

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

app ui

Вот как мои данные структурированы в FireStore. По сути, у меня есть коллекция пользователей , и у каждого отдельного пользователя есть несколько атрибутов, таких как его имя, класс и т. Д. c, а также подсборка из записей . В каждом сообщении записывается информация, которую пользователь заполняет в форме, но, что наиболее важно, в нем записывается метка времени, когда сообщение было отправлено. Вот скриншот для наглядности.

firestore data structure

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

         Container(
              child: Expanded(
                child: StreamBuilder<QuerySnapshot>(
                  stream: _firestore
                      .collectionGroup('posts')
                      .where('timestamp', isGreaterThanOrEqualTo: _start)
                      .where('timestamp', isLessThanOrEqualTo: _end)
                      .snapshots(),
                  builder: (context, snapshot) {
                    if (!snapshot.hasData)
                      return Center(child: Text("No Users"));
                    return ListView.builder(
                      shrinkWrap: true,
                      itemExtent: 80.0,
                      itemCount: snapshot.data.documents.length,
                      itemBuilder: (context, index) => _buildListItem(
                          context, snapshot.data.documents[index]),
                    );
                  },
                ),
              ),
            ),

_start и _end рассчитываются, когда пользователь выбирает другую дату.

child: CupertinoDatePicker(
                initialDateTime: _dateTime,
                use24hFormat: false,
                onDateTimeChanged: (val) {
                  setState(() {
                    _dateTime = val;
                    _start = DateTime(
                      _dateTime.year,
                      _dateTime.month,
                      _dateTime.day,
                      0,
                      0,
                    );
                    _end = DateTime(
                      _dateTime.year,
                      _dateTime.month,
                      _dateTime.day,
                      23,
                      59,
                      59,
                    );
                  });
                  print(val);
                  print(_dateTime);
                },
              ),

Пожалуйста, сообщите, как мне решить мою проблему. Я искал несколько дней, как решить эту проблему, но у меня ничего не вышло. Любая помощь или предложение приветствуется! Заранее спасибо!

1 Ответ

0 голосов
/ 19 марта 2020

Это потому, что вы никогда не вызываете функцию для извлечения данных при изменении даты. На onDateTimeChanged после изменения даты вы не вызываете функцию для извлечения каких-либо данных из firebase. Streambuilder прослушивает события, поступающие из потока, а не из ваших переменных.

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

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