我有一个 Hive 盒,可以使用
Map<String, dynamic>
保存 toJson()
。但是当我检索它时,结果是 Map<dynamic, dynamic>
,我尝试使用 jsonDecode()
转换它,但不起作用。我也尝试过先将其转换为String,然后用jsonEncode()
然后用jsonDecode()
将其包裹起来,仍然不起作用。
PS:除了Map之外的数据类型也可以正常工作
final HiveHelper hh = HiveHelper();
final box = Hive.openBox('boxip');
...
...
Future<void> saveDataIp(Map<String, dynamic> ip) async {
await hh.saveToBox(box, 'ip', ip);
}
...
Map<String, dynamic> getDataIp() {
Map<String, dynamic> map = {};
// ip resulting a _Map<dynamic, dynamic>
final ip = hh.getFrombox(box, 'ip');
if (ip != null) {
// with only using jsonDecode() gives error type "'_Map<dynamic, dynamic>' is not a subtype of type 'String'"
// below gives error "Converting object to an encodable object failed: Instance of 'DateTime'"
map = Map<String, dynamic>.from(jsonDecode(jsonEncode(ip)));
}
return map;
}
...
...
...
final data = Data(id: 1, name: "item", date: "2023-07-17T10:45:40.070Z");
await saveDataIp(data.toJson());
final dataBox = getDataIp();
首先,这里有两种类型可以让你的代码更简洁,并减少代码中的迷失:
我不确定你的问题是什么。
如果我总结一下:
那么你需要做什么?您可以在 Data 类中添加 fromMap() 方法,以将框结果解析回 Data 类型。
另外为什么不直接使用box.save()和box.get()呢?
数据.dart:
import 'dart:convert';
class Data {
final int id;
final String name;
final DateTime date;
Data({required this.id, required this.name, required this.date});
Map<String, dynamic> toMap() {
return <String, dynamic>{
'id': id,
'name': name,
'date': date.millisecondsSinceEpoch,
};
}
factory Data.fromMap(Map<String, dynamic> map) {
return Data(
id: map['id'] as int,
name: map['name'] as String,
date: DateTime.fromMillisecondsSinceEpoch(map['date'] as int),
);
}
String toJson() => json.encode(toMap());
factory Data.fromJson(String source) =>
Data.fromMap(json.decode(source) as Map<String, dynamic>);
}
然后:
Future<void> saveDataIp(Data data) async {
await hh.saveToBox(box, 'ip', data.toMap());
}
Data getDataIp() {
Map<String, dynamic> map = {};
// ip resulting a _Map<dynamic, dynamic>
final Map<String, dynamic>? dataMap = hh.getFrombox(box, 'ip');
if (ip == null) {
throw Exception('No ip found in the hiveBox');
}
return Data.fromMap(dataMap);
}
并且:
final Data dataToSave = Data(id: 1, name: "item", date: DateTime.parse("2023-07-17T10:45:40.070Z");
await saveDataIp(data);
final Data dataRead = getDataIp();
如果它满足您的需求请告诉我
你可以试试这个
jsonDecode(jsonEncode(<hive-data-type>))