【问题标题】:could not get data from firestore flutter with streambuilder, the path is correct but it still shows null data无法使用streambuilder从firestore中获取数据,路径正确但仍显示空数据
【发布时间】:2021-08-01 09:56:15
【问题描述】:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class Edit extends StatefulWidget {
@override
_EditState createState() => _EditState();
}

class _EditState extends State<Edit> {


@override
Widget build(BuildContext context) {
CollectionReference users= FirebaseFirestore.instance
.collection('users')
.doc(FirebaseAuth.instance.currentUser.email)
.collection('expense');

 return StreamBuilder<QuerySnapshot>(
          stream: users.snapshots(),
          builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
           // print(snapshot.data.docs.length);
            if(snapshot.hasError) {
              return CircularProgressIndicator();
            }
            return ListView(
              children: snapshot.data.docs.map((DocumentSnapshot documents) {
                return DataTable(
                  rows: [
                    DataRow(cells: [
                      DataCell(documents['amount']),
                      DataCell(documents['date']),
                      DataCell(documents['category']),
                      DataCell(documents['reference']),
                    ]),
                  ],
                );
              }).toList(),
            );
          },
        );

 }
 }

这些是由小部件引起的异常 在构建 StreamBuilder(dirty, state: _StreamBuilderBaseState#7a426) 时引发了以下 NoSuchMethodError: getter 'docs' 在 null 上被调用。 接收方:空 尝试调用:docs

 The following _TypeError was thrown building StreamBuilder<QuerySnapshot>(dirty, state: _StreamBuilderBaseState<QuerySnapshot, AsyncSnapshot<QuerySnapshot>>#7a426):
 type 'int' is not a subtype of type 'Widget'

【问题讨论】:

    标签: flutter dart google-cloud-firestore


    【解决方案1】:

    我假设您想在应用加载数据时显示进度指示器。 为此,您可以检查应用是否有数据并确定要显示的内容。

    因此您的构建器可以如下所示进行更新:

    builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
               // print(snapshot.data.docs.length);
                if(snapshot.data == null) {
                  return CircularProgressIndicator();
                }
    
    
                return ListView(
                  children: snapshot.data.docs.map((DocumentSnapshot documents) {
                    return DataTable(
                      rows: [
                        DataRow(cells: [
                          DataCell(documents['amount']),
                          DataCell(documents['date']),
                          DataCell(documents['category']),
                          DataCell(documents['reference']),
                        ]),
                      ],
                    );
                  }).toList(),
                );
              },
    

    错误The getter 'docs' was called on null. 的原因是因为您只检查错误而不是数据是否为空。 data 在操作完成之前为空。

    【讨论】:

      【解决方案2】:

      由于它是一个快照,数据加载到快照上需要一些时间。因此,在数据出现之前,您必须显示其他内容来代替 ListView()。 因此,您可以将 StreamBuilder 的构建器函数修改为

        ...
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
         // print(snapshot.data.docs.length);
          if(snapshot.hasError) {
            return CircularProgressIndicator();
          }
          if (!snapshots.hasData) {
            return Center(
              child: Text('Data not available',),
            );
          }
        ...
      

      【讨论】:

        猜你喜欢
        • 2023-01-01
        • 2021-02-20
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 2020-12-30
        • 2021-07-26
        • 2020-01-04
        • 2020-07-30
        相关资源
        最近更新 更多