dart 错误“参数类型'DateTime?'不能赋给参数类型'DateTime',”flutter firestore

2g32fytz  于 2023-01-28  发布在  Flutter
关注(0)|答案(3)|浏览(184)

我尝试从Firebase Firestore获取用户的用户数据。为此,我创建了一个模型类。这些数据中还有一个生日参数,我尝试在模型中定义该参数,但显示此错误"参数类型" DateTime?"无法分配给参数类型" DateTime ""

我的代码:

import 'dart:convert';

Users UsersFromJson(String str) => Users.fromJson(json.decode(str));

String UsersToJson(Users data) => json.encode(data.toJson());

class Users {
  Users({
    required this.id,
    required this.url,
    required this.name,
    required this.birthday,
  });
  String id;
  String name;
  String url;
  DateTime birthday;

  factory Users.fromJson(Map<String, dynamic> json) => Users(
    id: json["id"] ?? "",
    name: json["name"] ?? "",
    url: json["url"] ?? "",
    birthday: json["birthday"] != null ? DateTime.parse(json["birthday"]) : null,
  );

  Map<String, dynamic> toJson() => {
    "id": id,
    "name": name,
    "url": url,
    "birthday": birthday?.toString(),
  };
}

如何解决呢?

gjmwrych

gjmwrych1#

使你的birthday可以为空。

DateTime birthday;

DateTime? birthday;

如果您不希望它可以为空,则可以放置一个非空回退,如DateTime.now(),例如

birthday:
        json["birthday"] != null ? DateTime.parse(json["birthday"]) : DateTime.now(),
azpvetkf

azpvetkf2#

2个变通方案
1.将non nullable值传递给birthday

birthday: DateTime.parse(json["birthday"]) ?? DateTime.now(),

1.制造birthday nullable

DateTime? birthday

用这个方法你可以保留现有的代码行。2你的错误将不再显示。

xv8emn3q

xv8emn3q3#

您可以选择以下两种代码之一:

class Users {
  Users({
    required this.id,
    required this.url,
    required this.name,
    required this.birthday,
  });
  String id;
  String name;
  String url;
  DateTime? birthday;

  factory Users.fromJson(Map<String, dynamic> json) => Users(
    id: json["id"] ?? "",
    name: json["name"] ?? "",
    url: json["url"] ?? "",
    birthday: json["birthday"] != null ? DateTime.parse(json["birthday"]) : null,
  );

  Map<String, dynamic> toJson() => {
    "id": id,
    "name": name,
    "url": url,
    "birthday": birthday?.toString(),
  };
}
class Users {
  Users({
    required this.id,
    required this.url,
    required this.name,
    required this.birthday,
  });
  String id;
  String name;
  String url;
  DateTime birthday;

  factory Users.fromJson(Map<String, dynamic> json) => Users(
    id: json["id"] ?? "",
    name: json["name"] ?? "",
    url: json["url"] ?? "",
    birthday: json["birthday"] != null ? DateTime.parse(json["birthday"]) : DateTime.now(),
  );

  Map<String, dynamic> toJson() => {
    "id": id,
    "name": name,
    "url": url,
    "birthday": birthday?.toString(),
  };
}

但是,我建议您更多地使用第一个代码,因为如果birthday字段为空,您可以向用户显示没有数据。
如果使用第二个代码,我认为没有任何方法可以检查birthday字段是否为空。

相关问题