web-dev-qa-db-fra.com

Erreur d'application Flutter - le type «Horodatage» n'est pas un sous-type de type «DateTime»

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.

8
Suresh

.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.

18
Suresh

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);
}
5
EQuimper

ajouter la méthode toDate (). Cela fonctionnera

DateTime dateTime = documents[i].data["duedate"].toDate();
3
Hasib Akon

Je pense que c'est plus fiable

DateTime updateDateTime = DateTime.fromMillisecondsSinceEpoch(
        map['updatedatetime'].millisecondsSinceEpoch);
3
Jawand Singh
DateTime.fromMillisecondsSinceEpoch(timeStamp);
DateTime.fromMicrosecondsSinceEpoch(timeStamp);
1
aziza
var date = DateTime.fromMillisecondsSinceEpoch(timestamp)
0

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'])
0
kbrmys

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']);
  }
0
blaneyneil

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)
0
Richard K

Vous pouvez essayer ceci ..

timeago.format(DateTime.tryParse(timestamp))

comme chez toi ce sera

  timeago.format(DateTime.tryParse(document.data['tripDoc']['docCreatedOn']))
0
Harsha pulikollu