【问题标题】:Flutter Firestore Snapshot Documents loop doesnot stopFlutter Firestore 快照文档循环不会停止
【发布时间】:2020-07-17 03:46:09
【问题描述】:

所以我制作了一个具有未来构建器的屏幕,并将 getJobs() 作为未来。问题是未来的构建器获取空数据,因为快照文档的循环不会停止。这是代码:

Future<List<Job>> getJobs() async {
    var fbuser = await FirebaseAuth.instance.currentUser();
//    print('got user');
    var currentUser =
        await Firestore.instance.collection('user').document(fbuser.uid).get();
    setState(() {
      seeker = currentUser.data['seeker'];
//      print('seeker value = $seeker');
    });
    var snapshots = await Firestore.instance.collection('jobs').getDocuments();
    var snapshotDocuments = snapshots.documents;
    List<Job> jobs = [];
//    print('got Jobs');
    for (var docs in snapshotDocuments) {
      var job = Job(
        uid: docs.data['uid'],
        salaryTo: docs.data['salTo'],
        salaryFrom: docs.data['salFrom'],
        exp: docs.data['exp'],
        loc: docs.data['loc'],
        title: docs.data['title'],
        desc: docs.data['desc'],
        skill: docs.data['skill'],
        companyName: docs.data['companyName'],
      );
      print(job);
      jobs.add(job);
    }

    print('returning $jobs');
    return jobs;
  }

这里是构建方法

Widget build(BuildContext context) {
    return Scaffold(
      //appBar: AppBar(),
      body: FutureBuilder(
        future: getJobs(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
//          print(snapshot.hasData);
          if (snapshot.data == null)
            return Center(
              child: CircularProgressIndicator(),
            );
          else
            return ListView.builder(
                itemCount: snapshot.data.length,
                itemBuilder: (BuildContext context, int index) {
                  return Center(child: Text('GOT DATA'),);
                });
        },
      ),
      floatingActionButton: Visibility(
          visible: seeker ? false : true,
          child: FloatingActionButton(
            onPressed: () {},
            child: Icon(Icons.add_box),
          )),
    );
  }

感谢您的帮助!!

编辑 好的,我发现这个块有错误

var job = Job(
        uid: snapshotDocuments[i].data['uid'],
        salaryTo: snapshotDocuments[i].data['salTo'],
        salaryFrom: snapshotDocuments[i].data['salFrom'],
        exp: snapshotDocuments[i].data['exp'],
        loc: snapshotDocuments[i].data['loc'],
        title: snapshotDocuments[i].data['title'],
        desc: snapshotDocuments[i].data['desc'],
        skill: snapshotDocuments[i].data['skill'],
        companyName: snapshotDocuments[i].data['companyName'],
      );

如果我删除作业类实例的创建,数据循环结束,我不知道为什么会这样。

【问题讨论】:

  • 我认为getJobs() 中的setState() 是问题所在。它要求颤振重绘小部件,从而递归调用自身。
  • 没有同样的问题
  • 所以删除setState() 仍然给你加载圈,没有别的?
  • 我已经更新了问题,请看看并告诉我
  • 谢谢,这解决了问题。我正在为 int 分配一个字符串。

标签: firebase flutter dart google-cloud-firestore snapshot


【解决方案1】:

如果由于任何原因(例如服务器问题、互联网不可用或您自己的代码产生了一些异常。

因此,始终建议在FutureBuilder 中包含 3 个案例。

  1. 有效数据到达
  2. 数据正在加载
  3. 数据加载过程中出错

查看this SO post

【讨论】:

  • 问题出在作业部分。快照返回一个字符串,我将它存储在一个 int 中。
猜你喜欢
  • 2022-01-25
  • 2018-03-19
  • 1970-01-01
  • 2020-11-27
  • 2019-03-22
  • 2021-09-27
  • 1970-01-01
  • 2019-07-29
  • 2019-09-03
相关资源
最近更新 更多