Flutter 未处理的异常:将对象转换为可编码对象失败:';日期时间';
我有一个Task=>Flutter 未处理的异常:将对象转换为可编码对象失败:';日期时间';,flutter,dart,Flutter,Dart,我有一个Task=> 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(
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,
};
}
}
我试图使用.toString(),但出现以下错误=>类型“String”不是“index”的类型“int”的子类型 有没有办法在LocalStorage软件包上节省Datetime 更新:
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'],
),
),
);
}
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'],
// ),
// ),
// );
}
使用toJson
“changeDate”:changeDate==null?null:changeDate.toIso8601String(),
和fromJson
changeDate:json[“changeDate”]==null?null:DateTime.parse(json[“changeDate”]),
我强烈建议您使用和描述API
可能看起来是这样的:
import'package:json_annotation/json_annotation.dart';
“任务g.省道”部分;
@JsonSerializable(null:false,explicitToJson:true)
课堂任务{
最后的字符串名;
布尔伊斯通;
最终日期时间;
int优先级值;
任务({this.isDone,this.name,this.time,this.priorityValue});
factory Task.fromJson(Map json)=>$TaskFromJson(json);
映射到JSON()=>$TaskToJson(此);
}
之后,您需要运行build\u runner
:flatter pub run build\u runner build
它将毫不费力地生成toJson
和fromJson
方法:
Task\u$TaskFromJson(映射json){
返回任务(
isDone:json['isDone']作为bool,
名称:json['name']作为字符串,
time:DateTime.parse(json['time']作为字符串),
priorityValue:json['priorityValue']作为int,
);
}
映射$TaskToJson(任务实例)=>{
“name”:instance.name,
'isDone':instance.isDone,
“时间”:instance.time.toIso8601String(),
“priorityValue”:instance.priorityValue,
};
您可以查看测试:
void main(){
test('应该从json解析任务',(){
常量json=''
[
{
“名称”:“测试”,
“isDone”:假,
“时间”:“2021-01-12T13:57:10.705476”,
“优先级值”:0
}
]
''';
最终列表decodedJson=jsonDecode(json);
最终列表List=decodedJson.map((e)=>Task.fromJson(e)).toList();
最终任务=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);
});
}
我在from JSON DateTime.parse(jsonData['time'])和in to JSON m['time']=time.toIso8601String()中进行了操作;现在我得到这个错误类型'String'不是'DateTime'类型的子类型,我添加了一个morre代码var items=storage.getItem('tasks');if(items!=null){list.items=list.from((items as list).map((item)=>Task(name:item['name'],isDone:item['isDone'],time:DateTime.parse(item['time']),priorityValue:items['priorityValue'],),),;}现在获取类型“String”不是“index”的“int”类型的子类型“String”不是“DateTime”类型的子类型看起来像fromJson的问题,但是您的代码段看起来不错。也许您可以对您的问题进行代码更新。类型“String”不是“index”的“int”类型的子类型意味着您错误地将映射索引用于列表->因此myVar['time']
而不是myVar[1]
var items=storage.getItem('tasks');print($items”);I/flift(8537):[{name:testing,isDone:false,time:2021-01-12T13:57:10.705476,priorityValue:0}]类型字符串的时间变量,因此我添加了time:DateTime.parse(item['time']),类型“String”不是“index”的类型“int”的子类型。请检查您试图从JSON方法传递给的内容,并检查类型
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'],
// ),
// ),
// );
}
"${selectedDate.toLocal()}".split(' ')[0]