Flutter 如何将 Map<dynamic, dynamic> 从 Hive 框转换为 Map<String, dynamic>

问题描述 投票:0回答:3

我有一个 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();
flutter flutter-hive
3个回答
1
投票

首先,这里有两种类型可以让你的代码更简洁,并减少代码中的迷失:

  • 输入您的变量
  • 使用带有 linter 规则的analysis_options.yaml

我不确定你的问题是什么。

如果我总结一下:

  • 您创建一个数据类型的对象
  • 将其转换为 json => 输入 Map
  • 将其保存到 hiveBox 中
  • 您可以使用 Map 类型下的 getFrombox() 取回它

那么你需要做什么?您可以在 Data 类中添加 fromMap() 方法,以将框结果解析回 Data 类型。

另外为什么不直接使用box.save()和box.get()呢?


0
投票

数据.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();

如果它满足您的需求请告诉我


0
投票

你可以试试这个

jsonDecode(jsonEncode(<hive-data-type>))

© www.soinside.com 2019 - 2024. All rights reserved.