簡體   English   中英

未處理的異常:將 object 轉換為可編碼的 object 失敗:“日期時間”實例

[英]Unhandled Exception: Converting object to an encodable object failed: Instance of 'DateTime'

我有一個任務的 Model =>

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,
      };
}

當使用 localStorage package 來保存一些對象列表時,我得到了這個錯誤 =>

(顫振)未處理的異常:將 object 轉換為可編碼的 object 失敗:“日期時間”實例

_saveToStorage() {
storage.setItem('tasks', list.toJSONEncodable());
print("Saved");

}

我嘗試使用.toString() 但后來我得到這個錯誤=> type 'String' is not a subtype of type 'int' of 'index'

在 LocalStorage package 上保存日期時間的任何想法?

更新:

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

更新后我收到此錯誤“類型'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'],
              //     ),
              //   ),
              // );
            }

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

固定的

我將 DaeTme 更改為 model 中的字符串,並在得到它時將時間轉換為字符串

"${selectedDate.toLocal()}".split(' ')[0]

使用 toJson

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

和來自Json

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

我強烈建議您使用Retrofitjson_serializable來描述您的 API

它可能看起來像這樣:

import 'package:json_annotation/json_annotation.dart';

part 'task.g.dart';

@JsonSerializable(nullable: false, explicitToJson: true)
class Task {
  final String name;
  bool isDone;
  final DateTime time;
  int priorityValue;

  Task({this.isDone, this.name, this.time, this.priorityValue});

  factory Task.fromJson(Map<String, dynamic> json) => _$TaskFromJson(json);

  Map<String, dynamic> toJson() => _$TaskToJson(this);
}

之后,您需要運行build_runner
flutter pub run build_runner build

它會毫無痛苦地為您生成toJsonfromJson方法:

Task _$TaskFromJson(Map<String, dynamic> json) {
  return Task(
    isDone: json['isDone'] as bool,
    name: json['name'] as String,
    time: DateTime.parse(json['time'] as String),
    priorityValue: json['priorityValue'] as int,
  );
}

Map<String, dynamic> _$TaskToJson(Task instance) => <String, dynamic>{
      'name': instance.name,
      'isDone': instance.isDone,
      'time': instance.time.toIso8601String(),
      'priorityValue': instance.priorityValue,
    };

您可以查看測試:

void main() {
  test('Task should be parsed from json', () {
    const json = '''
    [
      {
        "name": "testing",
        "isDone": false,
        "time": "2021-01-12T13:57:10.705476",
        "priorityValue": 0
      }
    ]
    ''';

    final List decodedJson = jsonDecode(json);
    final List<Task> list = decodedJson.map((e) => Task.fromJson(e)).toList();

    final Task task = list.first;

    expect(task.name, 'testing');
    expect(task.isDone, false);
    expect(task.time, DateTime.parse("2021-01-12T13:57:10.705476"));
    expect(task.priorityValue, 0);
  });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM