我从Firestore返回的数据存在问题。我需要使用Cloud Firestore Plugin收到一些电子邮件:
class _EmailPageState extends State<EmailPage> {
//StreamBuilder<QuerySnapshot> _emails;
@override
void initState() {
super.initState();
//_emails = _getEmails();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Refer user'),
),
body: Column(
children: <Widget>[
Form(... form code)
Expanded(child: _getEmails()),
],
)
}
由于在从Firestore返回数据之前未填充_emails,因此我得到:
flutter: The following assertion was thrown building Expanded(flex: 1, dirty):
flutter: A build function returned null.
flutter: The offending widget is: Expanded(flex: 1)
flutter: Build functions must never return null. To return an empty space that causes the building widget to
flutter: fill available room, return "new Container()". To return an empty space that takes as little room as
flutter: possible, return "new Container(width: 0.0, height: 0.0)".
我不明白如何修复错误。视图显示正确。但我不想有错误。
StreamBuilder<QuerySnapshot> _getEmails() {
final query = Firestore.instance
.collection('emails')
.where("referer", isEqualTo: uid)
.snapshots();
return StreamBuilder<QuerySnapshot>(
stream: query,
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) return Text('Error: ${snapshot.error}');
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Text('Loading...');
default:
return _makeList(snapshot);
}
},
);
//setState(() {
//_emails = emailList;
//});
//return emailList;
}
ListView _makeList(AsyncSnapshot<QuerySnapshot> snapshot) {
return ListView(
children: snapshot.data.documents.map((DocumentSnapshot document) {
return ListTile(
title: Text(document['email']),
);
}).toList(),
);
}
您的_getEmails()
在数据到达之前返回null。它应该返回类似CircularProgressIndicator()
的东西。如果您显示该功能,您可以获得更多帮助,但您也可以使用此处的示例代码:https://docs.flutter.io/flutter/widgets/StreamBuilder-class.html
编辑:好的,我看到你的编辑。我想它毕竟不会返回null。然而,Expanded
需要是Row
或Column
的孩子。您应该用其中一个包装它,或者使用Container
,Center
等来进行定位。
此外,没有必要缓存StreamBuilder
,你不应该缓存小部件。但是,您可以缓存流。你应该至少改变你的代码
class _EmailPageState extends State<EmailPage> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Refer user'),
),
body: Center(child: _getEmails())
)
}
}