首页 > 解决方案 > 使用时间戳字段创建文档时,流式传输集合会出错

问题描述

在构建 StreamBuilder<QuerySnapshot<Map<String, dynamic>>>(dirty, state: _StreamBuilderBaseState<QuerySnapshot<Map<String, dynamic>>, AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>>#f407c 时引发了以下 NoSuchMethodError ): 方法 'toDate' 在 null 上被调用。接收方:null 尝试调用:toDate()

在按下 FAB 时,将创建一个带有 firebase 时间戳字段的文档。

现在在流式传输集合。我在一瞬间收到此错误。我认为问题是..是先创建文档,然后再使用时间戳进行更新。在创建文档的实例中导致错误。

在此处输入图像描述

class XYZ extends StatelessWidget {
  const XYZ({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            FirebaseFirestore.instance.collection('Test').add({'time': FieldValue.serverTimestamp()});
          },
        ),
        body: StreamBuilder<QuerySnapshot<Map<String, dynamic>>>(
          stream: FirebaseFirestore.instance.collection('Test').snapshots(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) return Center();

            snapshot.data!.docs.forEach((doc) {
              print(doc.data()['time'].toDate());
            });

            return Container();
          },
        ),
      ),
    );
  }
}

这是firestore的行为吗?或者我在我的代码中做了错误的实现?

标签: fluttergoogle-cloud-firestore

解决方案


首先,您的错误是toDate()在投射“TimeStamp”类之前使用。

请尝试以下几行;

snapshot.data!.docs.forEach((doc) {
final timestamp = doc.data()['time'] as Timestamp;
final dateTime = timestamp.toDate();
print('Date: ${dateTime}');
});

推荐阅读