【问题标题】:How to update ListView dynamically when user selects a different date?当用户选择不同的日期时如何动态更新 ListView?
【发布时间】:2020-06-30 05:57:50
【问题描述】:

对于我正在构建的应用程序,我希望用户能够通过下面显示的 CupertinoDatePicker 输入特定日期,并且在我希望下面的列表视图动态更新之后立即进行。列表视图应显示所有时间戳介于用户指定日期之间的帖子。

这是我的数据在 Firestore 中的结构。本质上,我有一个用户集合,每个用户都有一些属性,例如他们的姓名、等级等以及帖子的子集合。每个帖子都会记录用户在表单中填写的信息,但最重要的是它会记录提交帖子时的时间戳。为了清楚起见,这是一个屏幕截图。

我面临的问题是,当用户决定选择不同的日期时,列表视图不会更新。我的代码如下所示。

         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);
                },
              ),

请告知我将如何解决我的问题。我一直在寻找如何解决此问题的几天,但我没有成功。任何帮助或建议表示赞赏!提前致谢!

【问题讨论】:

    标签: firebase listview flutter google-cloud-firestore


    【解决方案1】:

    这是因为您在更改日期时从不调用该函数来获取数据。在 onDateTimeChanged 更改日期后,您不会调用函数从 firebase 检索任何数据。 Streambuilder 侦听来自流而非变量的事件。

    您可以将您的流作为状态变量,当您更改日期时更改您的流并且数据将被刷新。

    【讨论】:

    • 不会 _start 和 _end 改变吗?当用户更改日期时,我会在 setState 函数中更新它们的值。因此,不会从 firebase 获取新数据,因为我运行此查询: .where('timestamp', isGreaterThanOrEqualTo: _start).where('timestamp', isLessThanOrEqualTo: _end)
    • 流构建器实例始终订阅传递给它的流。
    • 我按照您的建议编写了代码,但现在没有显示数据。我创建了一个状态变量 postsStream 并在 onDateTimeChanged 内的 setState 中对其进行了更新。我将 StreamBuilder 中的流属性更改为 postsStream。我错过了什么吗?
    • 为我创建一个要点并发送它
    猜你喜欢
    • 2023-04-08
    • 2022-07-19
    • 2021-05-28
    • 1970-01-01
    • 2019-12-19
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    相关资源
    最近更新 更多