未来的构建者无法获取数据

时间:2019-07-13 12:20:52

标签: flutter dart future

我在代码中使用FutureBuilder来查询Firestore,但是我从FutureBuilder中指定的函数中一直没有得到任何数据。但是有趣的是,函数正在执行并获取数据。它只是不将其传递给FutureBuilder

代码:

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:garuda_academy_app/Tools/FixedColors.dart';

class CoursePage extends StatefulWidget {
  CoursePage({this.userEmail});
  final String userEmail;
  @override
  _CoursePageState createState() => _CoursePageState();
}

class _CoursePageState extends State<CoursePage> {
  @override
  void initState() {
    super.initState();
  }

  Future<List<DocumentSnapshot>> _getCourses() async {
    List<DocumentSnapshot> userCourses = [];

    await Firestore.instance
        .collection("Users")
        .document(widget.userEmail)
        .get()
        .then((DocumentSnapshot userDetails) {
      List<dynamic> courses = userDetails["Courses"];
      courses.forEach((dynamic course) {
        Firestore.instance
            .collection("Courses")
            .document(course)
            .get()
            .then((DocumentSnapshot courseDetails) {
          userCourses.add(courseDetails);

          print(userCourses.length);
        });
      });
    });

    return userCourses;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: secondaryColor,
      resizeToAvoidBottomInset: false,
      body: FutureBuilder(
        future: _getCourses(),
        builder: (context, AsyncSnapshot<List<DocumentSnapshot>> snapshot) {
          // loading display
          if (snapshot.hasError ||
              (snapshot.connectionState == ConnectionState.waiting)) {
            if (snapshot.hasError) print('${snapshot.error}');
            return Center(
              child: CircularProgressIndicator(
                valueColor: AlwaysStoppedAnimation<Color>(primaryColor),
              ),
            );
          }

          print(snapshot.data.length);

          return ListView.builder(
            itemCount: snapshot.data.length,
            itemBuilder: (context, index) {
              return Text(
                snapshot.data[index].documentID,
                style: TextStyle(color: Colors.black),
              );
            },
          );
        },
      ),
    );
  }
}

注意,我两次打印数据长度以检查是否得到了任何东西,输出结果如下:

0 // the future print
1 // the function print

await似乎并没有发挥应有的作用,因为将来似乎List之前是await

有人知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

问题是您正在FutureBuilder小部件中调用异步方法。在initState方法中调用该函数,并在一个变量中获取该返回值,然后在FutureBuilder窗口小部件中使用它。

Check this link for more understanding

Similar Problem

Future<List<DocumentSnapshot>> _course;

void initState()
{
    super.initState();
    course= _getCourses()
}

在FutureBuilder小部件中使用课程变量

FutureBuilder(
    future: _course,
    builder: write your code)

答案 1 :(得分:0)

需要从StreamBuilder而不是FutureBuilder调用Firestore实例,您可以从Flutter文档的this页面中找到有关此小部件的信息。

这是团队的例子:

StreamBuilder<int>(
  stream: _lot?.bids, // a Stream<int> or null
  builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
    if (snapshot.hasError)
      return Text('Error: ${snapshot.error}');
    switch (snapshot.connectionState) {
      case ConnectionState.none: return Text('Select lot');
      case ConnectionState.waiting: return Text('Awaiting bids...');
      case ConnectionState.active: return Text('\$${snapshot.data}');
      case ConnectionState.done: return Text('\$${snapshot.data} (closed)');
    }
    return null; // unreachable
  },
)