Потоковая передача коллекции приведет к ошибке при создании документа с полем метки времени

# #flutter #google-cloud-firestore

Вопрос:

Следующая ошибка noSuchMethod была вызвана при построении StreamBuilder<QuerySnapshot<Карта<Строка, динамическая><Строка, динамическая>><Строка, динамическая>>(грязная, состояние: _StreamBuilderBaseState<Строка, динамическая>>><QuerySnapshot<Карта<Строка, динамическая><Строка, динамическая>>, AsyncSnapshot<Строка, динамическая>><QuerySnapshot<Карта<Строка, динамическая><Строка, динамическая>><Строка, динамическая>><Строка, динамическая>>> < Строка, динамическая>>> > #f407c): Метод «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? Или я сделал неправильную реализацию в своем коде?

Ответ №1:

Во-первых, ваша ошибка заключается в использовании toDate() перед приведением класса «Метка времени».

Пожалуйста, попробуйте следующие строки;

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