未处理的异常:将对象转换为可编码对象失败:“DateTime”实例

Dah*_*leh 25 dart flutter

我有一个任务模型=>

class Task {


Task({this.isDone,this.name,this.time,this.priorityValue});
  final String name;
   bool isDone;
   final DateTime time;
   int priorityValue;



 factory Task.fromJson(Map<String, dynamic> jsonData) {
    return Task(
      name: jsonData['name'],
      isDone: false,
      time: jsonData['time'],
      priorityValue: jsonData['priorityValue'],
    );
  }

  toJSONEncodable() {
    Map<String, dynamic> m = new Map();

    m['name'] = name;
    m['isDone'] = isDone;
    m['time'] = time;
    m['priorityValue'] = priorityValue;

    return m;
  }

  static Map<String, dynamic> toMap(Task task) => {
        'name': task.name,
        'isDone': task.isDone,
        'time': task.time,
        'priorityValue': task.priorityValue,
      };
}
Run Code Online (Sandbox Code Playgroud)

当使用 localStorage 包保存一些对象列表时,我收到此错误=>

(颤动)未处理的异常:将对象转换为可编码对象失败:“DateTime”实例

_saveToStorage() {
storage.setItem('tasks', list.toJSONEncodable());
print("Saved");
Run Code Online (Sandbox Code Playgroud)

}

我尝试使用 .toString() 但后来出现此错误 => 类型“String”不是“index”的“int”类型的子类型

有什么想法可以将日期时间保存在 LocalStorage 包上吗?

更新:

factory Task.fromJson(Map<String, dynamic> jsonData) {
return Task(
  name: jsonData['name'],
  isDone: false,
  time: jsonData["time"] == null ? null : DateTime.parse(jsonData["time"]),
  priorityValue: jsonData['priorityValue'],
);


 }

  toJSONEncodable() {
Map<String, dynamic> m = new Map();

m['name'] = name;
m['isDone'] = isDone;
m['time'] = time == null ? null : time.toIso8601String();
m['priorityValue'] = priorityValue;

return m;


 }

static Map<String, dynamic> toMap(Task task) => {
    'name': task.name,
    'isDone': task.isDone,
    'time': task.time,
    'priorityValue': task.priorityValue,
  };


var items = storage.getItem('tasks');
            if (items != null) {
              list.items = List<Task>.from(
                (items as List).map(
                  (item) => Task(
                    name: item['name'],
                    isDone: item['isDone'],
                    time: DateTime.parse(item['time']),
                    priorityValue: items['priorityValue'],
                  ),
                ),
              );
            }
Run Code Online (Sandbox Code Playgroud)

更新后,我收到此错误“‘String’类型不是‘index’的‘int’类型的子类型”

更新2:

var items = storage.getItem('tasks');

            if (items != null) {
              final decodedJson = jsonDecode(items);
              list.items = (decodedJson as List)
                  .map((e) => Task.fromJson(e))
                  .toList();
              final task = list.items.first;
              print("${task.name}");
              // list.items = List<Task>.from(
              //   (items as List).map(
              //     (item) => Task(
              //       name: item['name'],
              //       isDone: item['isDone'],
              //       time: DateTime.parse(item['time']),
              //       priorityValue: items['priorityValue'],
              //     ),
              //   ),
              // );
            }
Run Code Online (Sandbox Code Playgroud)

第二次更新后,我得到“类型'_InternalLinkedHashMap <String,dynamic>'不是类型'String'的子类型”

固定的

我将模型中的日期时间更改为字符串,并在获取时将时间转换为字符串

"${selectedDate.toLocal()}".split(' ')[0]
Run Code Online (Sandbox Code Playgroud)

w46*_*461 17

使用toJson

"changeDate": changeDate == null ? null : changeDate.toIso8601String(),

和来自Json

changeDate: json["changeDate"] == null ? null : DateTime.parse(json["changeDate"]),

  • 上面的 **toJson** 代码可以进一步简化为:`"changeDate":changeDate?.toIso8601String(),`。请参阅 [prefer_null_aware_operators](https://dart-lang.github.io/linter/lints/prefer_null_aware_operators.html) (2认同)