Je récupère le magasin de données du cloud et j'essaie de l'afficher dans mon application en utilisant le code suivant.
new Text(timeago.format(document.data['tripDoc']['docCreatedOn'])),
J'utilise timeago
le paquet Dart pour formater cela. Mais, après avoir mis à jour le dernier plugin cloud firestore, je reçois cette erreur -
Another exception was thrown: type 'Timestamp' is not a subtype of type 'DateTime'
Impossible de comprendre comment analyser cet objet 'TimeStamp' en 'DateTime'. Parce que le plugin timeago
a besoin de données au format objet DateTime.
.toDate()
a fonctionné pour moi. Maintenant, le code modifié est -
new Text(timeago.format(document.data['tripDoc']['docCreatedOn'].toDate()))
J'espère que ça va aider quelqu'un.
Ios et Android ne recevra pas le même type. Ios reçoit les horodatages comme TimeStamp et Android le reçoit déjà comme DateTime. Donc, pour résoudre ce problème, je viens de créer ce petite fonction. Cela renverra un DateTime et permettra de le formater, etc.
import 'Dart:io';
import 'package:cloud_firestore/cloud_firestore.Dart';
DateTime parseTime(dynamic date) {
return Platform.isIOS ? (date as Timestamp).toDate() : (date as DateTime);
}
ajouter la méthode toDate (). Cela fonctionnera
DateTime dateTime = documents[i].data["duedate"].toDate();
Je pense que c'est plus fiable
DateTime updateDateTime = DateTime.fromMillisecondsSinceEpoch(
map['updatedatetime'].millisecondsSinceEpoch);
DateTime.fromMillisecondsSinceEpoch(timeStamp);
DateTime.fromMicrosecondsSinceEpoch(timeStamp);
var date = DateTime.fromMillisecondsSinceEpoch(timestamp)
Pour une drôle de raison, je ne peux pas utiliser toDate () sur Android. Je dois l'utiliser pour iOS. Je suis donc obligé d'utiliser une vérification de plateforme comme celle-ci:
Theme.of(context).platform == TargetPlatform.iOS
? DateFormat('dd MMM kk:mm').format(document['timestamp'].toDate())
: DateFormat('dd MMM kk:mm').format(document['timestamp'])
Firestore retourne un objet Timestamp, qui se compose de secondes et de nanosecondes. Curieusement, sur iOS, vous pouvez en effet simplement utiliser un .toDate () et cela fonctionne. Mais cela ne fonctionne pas Android comme toDate () n'est pas une méthode. Vous pouvez donc vérifier la plate-forme si vous le souhaitez, mais la solution universelle consiste à utiliser l'horodatage de Firestore:
import 'package:cloud_firestore/cloud_firestore.Dart';
DateTime _convertStamp(Timestamp _stamp) {
if (_stamp != null) {
return Timestamp(_stamp.seconds, _stamp.nanoseconds).toDate();
/*
if (Platform.isIOS) {
return _stamp.toDate();
} else {
return Timestamp(_stamp.seconds, _stamp.nanoseconds).toDate();
}
*/
} else {
return null;
}
}
puis passez-lui votre modèle:
SomeModel.fromJson(Map<String, dynamic> parsedJson) {
updatedAt = _convertStamp(parsedJson['updatedAt']);
}
Le type de champ d'horodatage Cloud Firebase a la structure:
Timestamp (Timestamp(seconds=1561186800, nanoseconds=0))
hashCode:423768083
microsecondsSinceEpoch:1561186800000000
millisecondsSinceEpoch:1561186800000
nanoseconds:0
runtimeType:Type (Timestamp)
seconds:1561186800
_seconds:1561186800
_nanoseconds:0
Vous pouvez donc utiliser des microsecondes ou des millisecondes:
DateTime.fromMillisecondsSinceEpoch(data['tripDoc']['docCreatedOn'].millisecondsSinceEpoch)
ou
DateTime.fromMicrosecondsSinceEpoch(data['tripDoc']['docCreatedOn'].microsecondsSinceEpoch)
Vous pouvez essayer ceci ..
timeago.format(DateTime.tryParse(timestamp))
comme chez toi ce sera
timeago.format(DateTime.tryParse(document.data['tripDoc']['docCreatedOn']))