问题描述
我在代码中使用了 FutureBuilder
来查询 Firestore
,但我一直没有从在 FutureBuilder中指定的函数中获取任何数据代码>.但是有趣的是,函数正在执行并获取数据.它只是不将其传递给
FutureBuilder
.
I'm using a FutureBuilder
in my code in order to query Firestore
but I keep getting no data from the function I specified in the FutureBuilder
. But funny enough the function is executing and getting the data. It is just not passing it to the 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),
);
},
);
},
),
);
}
}
注意,我打印了两次数据长度以检查是否得到了任何东西,输出是这样的:
Notice I print the data length twice to check if I am getting anything, the output is as such:
0 // the future print
1 // the function print
await
似乎无法正常运行,因为将来似乎会在 await
之前采用 List
.
It seems like await
is not functioning as it should as the future seems to take the List
before await
.
有人知道为什么会这样吗?
Does anyone know why this is happening ?
推荐答案
问题是您正在FutureBuilder窗口小部件中调用异步方法.在initState方法中调用该函数,并在一个变量中获取该返回值,然后在FutureBuilder窗口小部件中使用该返回值.
Problem is you are calling async method in inside FutureBuilder Widget. call that function inside initState method and get that return value in one varible and use that in FutureBuilder Widget.
Future<List<DocumentSnapshot>> _course;
void initState()
{
super.initState();
course= _getCourses()
}
在FutureBuilder窗口小部件中使用课程变量
use course variable in FutureBuilder Widget
FutureBuilder(
future: _course,
builder: write your code)
这篇关于未来的建设者没有得到数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!