Flutter Ошибка расширенного броска при ожидании данных из Firestore - PullRequest
0 голосов
/ 30 апреля 2019

У меня проблема с данными, которые я возвращаю из Firestore. Мне нужно получить несколько писем с помощью плагина Cloud Firestore :

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()),
      ],
    )
}

Поскольку _emails не заполняется, пока данные не возвращаются из Firestore, я получаю:

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(),
    );
  }

1 Ответ

0 голосов
/ 30 апреля 2019

Ваш _getEmails() возвращает ноль до поступления данных.Вместо этого он должен вернуть что-то вроде CircularProgressIndicator().Если вы показываете эту функцию, вы можете получить дополнительную помощь, но вы также можете использовать пример кода здесь: https://docs.flutter.io/flutter/widgets/StreamBuilder-class.html

Редактировать: хорошо, я вижу ваши изменения.Я думаю, это не возвращает ноль в конце концов.Однако 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())
    )
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...