我正在嘗試從我的資產中的本地 json 檔案中獲取資料。我接收并解碼資料,然后嘗試將其存盤在串列中以供進一步使用。但它給了我例外。我希望串列的型別為OriginDestination,將其存盤在資料庫中,然后進一步使用它。有人可以告訴我如何將資料從 json 決議到 OriginDestination。
類 OriginDestination -
OriginDestination cityDtoFromJson(String str) => OriginDestination.fromJson(json.decode(str));
String cityDtoToJson(OriginDestination data) => json.encode(data.toJson());
@HiveType(typeId: 0)
// ignore: non_constant_identifier_names
class OriginDestination extends HiveObject {
@HiveField(0)
City? origin;
@HiveField(1)
List<City>? destinations;
OriginDestination({
this.origin,
this.destinations,
});
factory OriginDestination.fromJson(Map<String, dynamic> json) => OriginDestination(
origin: City.fromJson(json["origin"]),
destinations: List<City>.from(
json["destinations"].map((x) => City.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"origin": origin,
"destinations": destinations,
};
我正在獲取資料并想要使用它的代碼(originDestinations 也是 OriginDestination 型別的串列)-
List<OriginDestination>? localOriginDestination = [];
Future<void> readJson() async {
final String response = await rootBundle.loadString('assets/files/node.json');
final data = await json.decode(response);
localOriginDestination = await data["data"].cast<OriginDestination>();
print(localOriginDestination);
if(localOriginDestination!=null) {
await _localStorageService.getBox().clear();
await _localStorageService.getBox().addAll(localOriginDestination!.toList());
originDestinations = _localStorageService.getOriginDestinations();
}
}
uj5u.com熱心網友回復:
我以前從未使用過 Hive,但這行代碼對我來說似乎很可疑:
localOriginDestination = await data["data"].cast<OriginDestination>();
我認為你想做一些事情:
localOriginDestination = [
for (final element in await data['data']) OriginDestination.fromJson(element),
];
但如果不知道 的價值await data['data']是什么,我就不能完全確定。
編輯,添加更多資訊。
的.cast方法上List只是為了與一種型別,它是原始串列型別的子型別,如在本例中被使用:
void main() {
List<num> nums = [1, 2, 3];
List<int> ints = nums.cast<int>();
ints.add(4);
print(ints);
}
你正在做的事情本質上與此相同。
void main() {
List<Map<String, int>> items = [
{'A': 1, 'B': 2},
{'A': 3, 'B': 4},
];
final result = items.cast<ABC>();
print(result);
}
class ABC {
int a;
int b;
ABC.fromJson(Map<String, dynamic> json)
: a = json['A'],
b = json['B'];
}
這里的問題是ABC該類不是Map<String, int>. 類不是 dart 編程語言中的映射。您需要.fromJson在items串列的每個元素上呼叫建構式才能獲得List<ABC>.
您可以通過幾種不同的方式來做到這一點。
使用map方法是一種方法。(您需要使用 dart 2.15 才能使用此確切語法)
List<ABC> result = items.map(ABC.fromJson).toList();
使用for 集合回圈遍歷專案是另一種方法。
List<ABC> result = [for (final element in items) ABC.fromJson(element)];
使用傳統的 for 回圈遍歷專案是另一種方法。
List<ABC> result = [];
for (final element in items) {
result.add(ABC.fromJson(element));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399061.html
