繁体   English   中英

Flutter stream 删除问题

[英]Flutter stream deletion issue

我正在处理使用 Firestore 的 Flutter 应用程序。 我已经在带有列表视图的应用程序中显示了我的文档。 感谢 Flutter stream,我可以更新文档并立即出现在应用程序中。但是,我在删除文档时遇到了问题。 似乎删除在现实中工作正常,但应用程序中的显示显示错误信息。 例如,我删除了索引为 1 的文档,但始终删除了最后一个索引的文档。 似乎来自 FireStore stream 的事件只是更新了 stream 中的文档数量,列表视图通过另一个小部件(如客户列表磁贴)显示信息,每个索引的信息未正确更新。 下面是我的代码:

    class _BudgetSummaryState extends State<BudgetSummary> {
  Stream<QuerySnapshot> getSummaries() => FirebaseFirestore.instance
      .collection('Users')
      .doc(FirebaseAuth.instance.currentUser!.phoneNumber)
      .collection('UserDBs')
      .snapshots();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: MyAppBar('Summary'),
      floatingActionButton: FloatingActionButton.extended(
        onPressed: () {
          Navigator.of(context).pushNamed('/Update_Edit_Screens/AddNewBudget');
        },
        label: const Text('Add new'),
        icon: const Icon(Icons.add),
      ),
      body: SafeArea(
          child: StreamBuilder<QuerySnapshot>(
              stream: getSummaries(),
              builder: (context, snapshot) {
                if (snapshot.hasError) {
                  return const Center(
                    child: Text('Something went wrong, please try again later'),
                  );
                }
                if (snapshot.hasData) {
                  var data = snapshot.data;
                  if (data == null) {
                    return const Center(
                      child: Text('Add you first budget/expense tracker'),
                    );
                  } else {
                    return ListView.builder(
                        itemCount: data.docs.length,
                        itemBuilder: ((context, index) {
                          Color col =
                              index % 2 == 0 ? Colors.lightBlue : Colors.lime;
                          return SummaryWidget(data.docs[index], col);
                        }));
                  }
                } 

我通过重新加载整个页面做了一个解决方法,即重建完整的路线。 但不知何故,我觉得它扼杀了使用 stream 的目的。请告知我是否遗漏了什么?

Flutter数据删除经典问题。

您需要为每个列表项提供 Key。 您可以使用 ValueKey 可以为每个列表项获取一些唯一的 ID。 就像是

return SummaryWidget(key:ValueKey(data.docs[index].id), data.docs[index], col);

如果您想知道推理,请告诉我,我会在这里更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM