Flutter等待来自Firestore的数据时出现抛出错误

问题描述 投票:0回答:1

我从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(),
    );
  }
flutter google-cloud-firestore
1个回答
0
投票

您的_getEmails()在数据到达之前返回null。它应该返回类似CircularProgressIndicator()的东西。如果您显示该功能,您可以获得更多帮助,但您也可以使用此处的示例代码:https://docs.flutter.io/flutter/widgets/StreamBuilder-class.html

编辑:好的,我看到你的编辑。我想它毕竟不会返回null。然而,Expanded需要是RowColumn的孩子。您应该用其中一个包装它,或者使用ContainerCenter等来进行定位。

此外,没有必要缓存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())
    )
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.