首页 > 解决方案 > 主页加载时如何从 Firestore 获取数据?

问题描述

我正在尝试用 Flutter 制作一个待办事项列表应用程序。主页加载时,数据不会出现在程序上

我尝试了 QuerySnapshot、'.then'、sleep 等等,但不幸的是它们都不起作用

我试图调试并找到问题所在。看起来在程序加载时,来自 Firestore 的数据还没有准备好,这就是它没有出现在主页上的原因。



import 'dart:async';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'dart:io';

class home extends StatefulWidget {
  static const String id = 'home';
  @override
  _homeState createState() => _homeState();
}

class _homeState extends State<home> {
  String userUid;
  FirebaseUser loggedInUser;
  final _fireStore = Firestore.instance;

  final _auth = FirebaseAuth.instance;
  List<Container> messageWidgets = [];

  void getCurrentUser() async {
    final user = await _auth.currentUser();
    if (user != null) {
      loggedInUser = user;
      userUid = loggedInUser.uid;
    }
  }

  getTasks() {
    print('///////////////Get tasks///////////////');
    return _fireStore
        .document('Userss')
        .collection('$userUid/Tasks')
        .getDocuments();
  }


  bool boool = false;
  var tasks;

  @override
  void initState() {
    getCurrentUser();
    getTasks().then((QuerySnapshot docs) {
      if (docs.documents.isNotEmpty) {
        boool = true;
        tasks = docs.documents[0].data;
      }
    });
    super.initState();
  }


  @override
  Widget build(BuildContext context) {
    return SafeArea(
        child: Center(
            child: Column(
      children: <Widget>[
        boool
            ? Column(
                children: <Widget>[
                  Text(tasks['Task']),
                  Text(tasks['Category']),
                ],
              )
            : Container(
                child: Text('No DATA'),
              ),
      ],
    )));
  }


我希望数据在主页加载时出现,但没有出现

标签: flutterdartgoogle-cloud-firestoreflutter-layout

解决方案


我的快速猜测是您需要使用setState(),因为数据是从 Firestore 异步加载的。

所以像:

getTasks() {
  print('///////////////Get tasks///////////////');
  _fireStore
    .document('Userss')
    .collection('$userUid/Tasks')
    .getDocuments().then((QuerySnapshot docs) {
      if (docs.documents.isNotEmpty) {
        boool = true;
        setState(() {
          tasks = docs.documents[0].data;
        });
      }
    });
}

推荐阅读