无法将大量文档检索到Firestore抖动中

时间:2020-08-17 13:49:38

标签: flutter google-cloud-firestore

我有一个小问题,我需要将StreamBuilder从Firestore检索的集合检索到列表中。 我正在使用snapshot.data.documents.lenght ,但是一旦添加,就会出现错误:

Class 'DocumentSnapshot' has no instance getter 'documents'.
Receiver: Instance of 'DocumentSnapshot'
Tried calling: documents

这是我的代码:

  Stream<DocumentSnapshot> getDatabase() async* {
    FirebaseUser user = await FirebaseAuth.instance.currentUser();
    yield* Firestore.instance
        .collection('dataCollection')
        .document(user.uid)
        .snapshots();
  }

  @override
  Widget build(BuildContext context,) {
    return StreamBuilder(
      stream: getDatabase(),
      builder: (context, snapshot,) {
        if (snapshot.data != null) {
          return Column(
            children: <Widget>[
              Container(
                height: 500,
                child: ListView.builder(
                  shrinkWrap: true,
                  itemCount: 2,
                  itemBuilder: (BuildContext context, int index) {
                    return Card(
                      color: Color(0xFF1f2032),
                      elevation: 15,
                      child: Text(
                        snapshot.data['phone']..
                        

2 个答案:

答案 0 :(得分:0)

只需按照以下步骤更改代码

Stream dataStream

然后

   @override
  void initState() {
    getDatabase().then((value) {
      dataStream = value;
      setState(() {});
    });
    super.initState();
  }

函数getDatbase()

getDatabase() async {
    FirebaseUser user = await FirebaseAuth.instance.currentUser();
    yield* Firestore.instance
        .collection('dataCollection')
        .document(user.uid)
        .snapshots();
  }

然后

 @override
  Widget build(BuildContext context,) {
    return StreamBuilder(
      stream: dataStream,
      builder: (context, snapshot,) {
        if (snapshot.data != null) {
          return Column(
            children: <Widget>[
              Container(
                height: 500,
                child: ListView.builder(
                  shrinkWrap: true,
                  itemCount: 2,
                  itemBuilder: (BuildContext context, int index) {
                    return Card(
                      color: Color(0xFF1f2032),
                      elevation: 15,
                      child: Text(
                        snapshot.data['phone']..
                    

答案 1 :(得分:-1)

尝试一下,

StreamBuilder(
              stream: stream,
              builder: (BuildContext context,
                  AsyncSnapshot<List<DocumentSnapshot>> snapshots) {
                if (snapshots.connectionState == ConnectionState.active &&
                    snapshots.hasData) {
                  return Expanded(
                    child: ListView.builder(
                      scrollDirection: Axis.vertical,
                      shrinkWrap: true,
                      itemCount: snapshots.data.length,
                      itemBuilder: (BuildContext context, int index) {
                        
                      //do something with snapshot.

                        
                          }
                        }
                        return Container();
                      },
                    ),
                  );
                } else {
                  return Container();
                }
              },
            ),


像这样初始化您的流,

Stream<DocumentSnapshot> stream;
  Future<dynamic> getDatabase() async {
    

    FirebaseUser user = await FirebaseAuth.instance.currentUser();
   
  
    setState(() {
    
      stream=Firestore.instance
        .collection('dataCollection')
        .document(user.uid)
        .snapshots();
    });
  }

您可以在initState中调用getDatabase()。

更新:-

这是您的完整代码。





class DataCo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        backgroundColor: Colors.blue,
      ),
      body: Column(
        children: [
          CollectData(),
        ],
      ),
    );
  }
}



class CollectData extends StatefulWidget {
  @override
  _CollectDataState createState() => _CollectDataState();
}

class _CollectDataState extends State<CollectData> {
  final String phone;
  final String wife;
  final String location;

  _CollectDataState({this.phone, this.wife, this.location});


@override
  void initState() {
 super.initState();
    getDatabase();
     
   
  }

  Stream<DocumentSnapshot> stream;
  Future<dynamic> getDatabase() async {



    FirebaseUser user = await FirebaseAuth.instance.currentUser();


    setState(() {

      stream=Firestore.instance
        .collection('dataCollection')
        .document(user.uid)
        .snapshots();
    });
  }


  @override
  Widget build(BuildContext context,) {
    return StreamBuilder(
              stream: stream,
              builder: (BuildContext context,
                  AsyncSnapshot<DocumentSnapshot> snapshots) {
                if (snapshots.connectionState == ConnectionState.active &&
                    snapshots.hasData) {
                  return Expanded(
                    child: ListView.builder(
                      scrollDirection: Axis.vertical,
                      shrinkWrap: true,
                      itemCount: snapshots.data.length,
                      itemBuilder: (BuildContext context, int index) {

                      //do something with snapshot.


                          }
                        }
                        return Container();
                      },
                    ),
                  );
                } else {
                  return Container();
                }
              },
            );
  }
}

class NoData extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('No Data available'),
      ],
    );
  }
}