Flutter app error - 类型'Timestamp'不是'DateTime'类型的子类型

问题描述 投票:8回答:10

我正在使用以下代码获取数据云防火墙并尝试在我的应用程序中显示。

new Text(timeago.format(document.data['tripDoc']['docCreatedOn'])),

我正在使用timeago dart包来格式化它。但是,在更新到最新的云firestore插件后,我收到此错误 -

Another exception was thrown: type 'Timestamp' is not a subtype of type 'DateTime'

无法理解如何将此'TimeStamp'对象解析为'DateTime'。因为timeago插件需要DateTime对象格式的数据。

dart flutter
10个回答
14
投票

.toDate()为我工作。现在修改后的代码是 -

new Text(timeago.format(document.data['tripDoc']['docCreatedOn'].toDate()))

希望,它会帮助某人。


0
投票

Cloud Firebase时间戳字段类型具有以下结构:

Timestamp (Timestamp(seconds=1561186800, nanoseconds=0))
hashCode:423768083
microsecondsSinceEpoch:1561186800000000
millisecondsSinceEpoch:1561186800000
nanoseconds:0
runtimeType:Type (Timestamp)
seconds:1561186800
_seconds:1561186800
_nanoseconds:0

所以你可以使用微秒或毫秒:

DateTime.fromMillisecondsSinceEpoch(data['tripDoc']['docCreatedOn'].millisecondsSinceEpoch)

要么

DateTime.fromMicrosecondsSinceEpoch(data['tripDoc']['docCreatedOn'].microsecondsSinceEpoch)

3
投票

我认为这更可靠

DateTime updateDateTime = DateTime.fromMillisecondsSinceEpoch(
        map['updatedatetime'].millisecondsSinceEpoch);

2
投票

Ios和Android不会收到相同的类型。 Ios收到时间戳,因为TimeStamp和Android已经将其作为DateTime接收。因此,为了解决这个问题,我刚刚创建了这个小功能。这将返回DateTime并让我们使用格式等。

import 'dart:io';

import 'package:cloud_firestore/cloud_firestore.dart';

DateTime parseTime(dynamic date) {
  return Platform.isIOS ? (date as Timestamp).toDate() : (date as DateTime);
}

1
投票
DateTime.fromMillisecondsSinceEpoch(timeStamp);
DateTime.fromMicrosecondsSinceEpoch(timeStamp);

1
投票

添加toDate()方法。它会工作

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

0
投票
var date = DateTime.fromMillisecondsSinceEpoch(timestamp)

0
投票

出于某些有趣的原因,我不能在Android上使用toDate()。必须在iOS上使用它。所以我被迫使用这样的平台检查:

Theme.of(context).platform == TargetPlatform.iOS
  ? DateFormat('dd MMM kk:mm').format(document['timestamp'].toDate())
  : DateFormat('dd MMM kk:mm').format(document['timestamp'])

0
投票

你可以尝试这个..

timeago.format(DateTime.tryParse(timestamp))

就像你的一样

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

0
投票

Firestore返回一个Timestamp对象,该对象由秒和纳秒组成。奇怪的是,在iOS上你确实可以使用.toDate()并且它可以工作。但是,由于toDate()不是一种方法,因此在Android上中断了。因此,您可以根据需要进行平台检查,但通用解决方案是使用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;
  }
}

然后将模型传递给它:

  SomeModel.fromJson(Map<String, dynamic> parsedJson) {
    updatedAt = _convertStamp(parsedJson['updatedAt']);
  }
© www.soinside.com 2019 - 2024. All rights reserved.