dart 如何使用Flutter冻结包生成模型中的日期时间

pw9qyyiw  于 2022-12-16  发布在  Flutter
关注(0)|答案(1)|浏览(160)

我有一个冻结的部分

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user_model.freezed.dart';
part 'user_model.g.dart';

@freezed
class UserModel with _$UserModel {
  factory UserModel({
    required String id,
    @Default('') String uniqueId,
    @Default(DateTime.now()) DateTime dob,

  }) = _UserModel;

  factory UserModel.fromJson(Map<String, dynamic> json) =>
      _$UserModelFromJson(json);
}

但由于DateTime.now(),我无法生成所需的文件。
如果我这样做:

factory UserModel({
        required String id,
        @Default('') String uniqueId,
        required DateTime dob,
    
      }) = _UserModel;

它将工作,但我必须手动编辑生成的数据如下:

dob: (json['dob'] as Timestamp?)?.toDate() ?? DateTime.now()

dob: DateTime.parse(json['dob'] as String),

我不能一直手动编辑它。
请告诉我如何生成包含日期时间的模型类。

z9smfwbn

z9smfwbn1#

您需要在冻结的模型类中手动添加序列化逻辑。
在这种特定情况下,您需要firestore时间戳序列化逻辑。
只要加上

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:json_annotation/json_annotation.dart';

class TimestampSerializer implements JsonConverter<DateTime, dynamic> {
  const TimestampSerializer();

  @override
  DateTime fromJson(dynamic timestamp) => timestamp.toDate();

  @override
  Timestamp toJson(DateTime date) => Timestamp.fromDate(date);
}

并为DateTime属性添加TimestampSerializer()注解,如下所示。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user_model.freezed.dart';
part 'user_model.g.dart';

@freezed
class UserModel with _$UserModel {
  factory UserModel({
    required String id,
    @Default('') String uniqueId,
    @TimestampSerializer() required DateTime dob,

  }) = _UserModel;

  factory UserModel.fromJson(Map<String, dynamic> json) =>
      _$UserModelFromJson(json);
}

最后运行build runner,就可以开始了。
希望有帮助!快乐编码:)

相关问题