在 dart/flutter 中执行多次从 firestore 获取数据的异步函数

Posted

技术标签:

【中文标题】在 dart/flutter 中执行多次从 firestore 获取数据的异步函数【英文标题】:async function that gets data from firestore executing multiple times in dart/flutter 【发布时间】:2021-08-17 12:53:30 【问题描述】:

我在这里有一段代码应该从 firebase firestore 获取一些数据并将该数据添加到列表中,然后 listview.builder 使用该列表来使用项目列表更新 ui。但不知何故,相同的数据不断地一次又一次地添加到列表中。我放了一个打印语句,我可以看到“then”函数中的代码不断地执行。我如何阻止这种情况发生? 提前致谢

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';

import '../models/reportmodel.dart';
import 'package:flutter/material.dart';

class AllReports extends StatefulWidget 
  @override
  _AllReportsState createState() => _AllReportsState();


class _AllReportsState extends State<AllReports> 
  List<Report> reportList = [];
  bool isLoading = true;

  @override
  Widget build(BuildContext context) 
    getData();
    return (isLoading)
        ? buildLoading()
        : ListView.builder(
            padding: EdgeInsets.all(20),
            itemBuilder: (context, index) 
              return Container(
                width: double.infinity,
                height: 140,
                child: Column(
                  children: [
                    Text(
                      "Complaint ID: " + reportList[index].getComplaintHash(),
                      style: TextStyle(fontWeight: FontWeight.bold),
                    ),
                    Text(
                      "Name: " + reportList[index].getComplainantName(),
                    ),
                    Text("Time: " + reportList[index].getComplaintTime()),
                  ],
                ),
              );
            ,
            itemCount: reportList.length);
  

  Widget buildLoading() => Stack(
        fit: StackFit.expand,
        children: [
          Center(child: CircularProgressIndicator()),
        ],
      );

  void getData() async 
    final user = FirebaseAuth.instance.currentUser;
    final snapshot = await FirebaseFirestore.instance
        .collection(user.email)
        .getDocuments()
        .then((snapshot) 
      for (int i = 0; i < snapshot.documents.length; i++) 
        reportList.add(Report.addData(
            snapshot.documents[i].id.toString(),
            snapshot.documents[i].data()["name"].toString(),
            snapshot.documents[i].data()["contact"].toString(),
            snapshot.documents[i].data()["time"].toString(),
            snapshot.documents[i].data()["description"].toString(),
            snapshot.documents[i].data()["additional_info"].toString()));
      
      this.setState(() 
        isLoading = false;
      );
    );
  

【问题讨论】:

嗨,那里。我只是想问一下您的数据中有多少项?因为我认为“getData()”内部的循环是问题的原因。 【参考方案1】:

它被一遍又一遍地执行,因为你在 build() 内部调用方法 getData(),每次调用 setState 时它都会发出另一个构建。因此,方法 getData() 将继续执行并且检索数据。

您应该使用FutureBuilder 小部件来处理异步操作。

https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

【讨论】:

本来想写一样的,但正如德国谚语所说:“早起的鸟儿有虫吃”

以上是关于在 dart/flutter 中执行多次从 firestore 获取数据的异步函数的主要内容,如果未能解决你的问题,请参考以下文章

Dart/Flutter - 回调函数中的“yield”

flutter - 如何在Dart/Flutter中将某些元素从一个Map复制到新Map中?

为啥在 dart/flutter 中不等待 await 返回就执行代码?

如何使用 Dart / Flutter 中的列表从列表中删除重复元素?

Dart // Flutter:如何根据条目的内容从列表中删除项目

如何编写解析此 JSON 的 Dart 模型类?