0

我想从 firestore 下载列表并在颤振小部件中显示为列表。数据已成功下载(由 print(cp.data() 证明)。

但是,显示的结果是[Instance of '_JsonQueryDocumentSnapshot']而不是实际的停车场数据。

任何人都可以帮助指出错误是什么。

谢谢


class DownloadDataScreen extends StatefulWidget {
  @override
  _DownloadDataScreen createState() => _DownloadDataScreen();
}

class _DownloadDataScreen extends State<DownloadDataScreen> {
  List<DocumentSnapshot> carparkList = []; //List for storing carparks

  void initState() {
    super.initState();
    readFromFirebase();
  }

  Future readFromFirebase() async {
    // await FirebaseFirestore.instance
    await FirebaseFirestore.instance
        .collection('carpark')
        .get()
        .then((QuerySnapshot snapshot) {
      snapshot.docs.forEach(
        (DocumentSnapshot cp) {
          carparkList.add(cp);

          print('printing cp');
          print(cp.data());
        },
      );
    });

    **return carparkList;**
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: new AppBar(
        title: new Text(
          'Car Park',
          style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
        ),
        centerTitle: true,
      ),
      body: FutureBuilder(

        future: readFromFirebase(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          List<Widget> children;
          if (snapshot.hasData) {
            children = <Widget>[
              const Icon(
                Icons.check_circle_outline,
                color: Colors.green,
                size: 60,
              ),
              Padding(
                padding: const EdgeInsets.only(top: 16),
                child: Column(
                  children: [
                    Text('Result: ${snapshot.data}'),
                  ],
                ),
              )
            ];
          } else if (snapshot.hasError) {
            children = <Widget>[
              const Icon(
                Icons.error_outline,
                color: Colors.red,
                size: 60,
              ),
              Padding(
                padding: const EdgeInsets.only(top: 16),
                child: Text('Error: ${snapshot.error}'),
              )
            ];
          } else {
            children = const <Widget>[
              SizedBox(
                child: CircularProgressIndicator(),
                width: 60,
                height: 60,
              ),
              Padding(
                padding: EdgeInsets.only(top: 16),
                child: Text('Awaiting result...'),
              )
            ];
          }
          return Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: children,
            ),
          );
        },
      ),
    );
  }

}
4

1 回答 1

1

首先,您不需要从 init 调用该函数,因为您已经使用了FutureBuilder.

此外,您不需要强制转换它,因为当未来完成时,异步快照已经为您提供DocumentSnapshot了数据列表和 .doc 属性。

像这样:

FutureBuilder<QuerySnapshot>(
  builder:(context,snapshot){
    if(snapshot.hasData){
      /// here your data 
      snapshot.data.docs;
    }
)
于 2021-08-21T14:51:53.270 回答