我在代码中使用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
。
有人知道为什么会这样吗?
答案 0 :(得分:1)
问题是您正在FutureBuilder小部件中调用异步方法。在initState方法中调用该函数,并在一个变量中获取该返回值,然后在FutureBuilder窗口小部件中使用它。
Check this link for more understanding
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
},
)