我是一名 React JS / 原生开发人员,正在尝试学习 Flutter。 这是来自我的外部 API 的示例对象。
[
{
"place_id":224809725,
"licence":"Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright",
"osm_type":"node",
"osm_id":637895939,
"boundingbox":[
"6.5834343",
"6.6634343",
"80.5031464",
"80.5831464"
],
"lat":"6.6234343",
"lon":"80.5431464",
"display_name":"Pelmadulla, Ratnapura District, Sabaragamuwa Province, 70070, Sri Lanka",
"class":"place",
"type":"town",
"importance":0.41001
}
]
现在我创建了这个模型类来操作我的数据。
class AddressModel {
int placeId;
double lat;
double lon;
String displayName;
AddressModel({
required this.placeId,
required this.lat,
required this.lon,
required this.displayName,
});
factory AddressModel.fromMap(Map<String, dynamic> map) {
return AddressModel(
placeId: map['placeId']?.toInt() ?? 0,
lat: map['lat']?.toDouble() ?? 0.0,
lon: map['lon']?.toDouble() ?? 0.0,
displayName: map['displayName'] ?? '',
);
}
AddressModel copyWith({
int? placeId,
double? lat,
double? lon,
String? displayName,
}) {
return AddressModel(
placeId: placeId ?? this.placeId,
lat: lat ?? this.lat,
lon: lon ?? this.lon,
displayName: displayName ?? this.displayName,
);
}
Map<String, dynamic> toMap() {
final result = <String, dynamic>{};
result.addAll({'placeId': placeId});
result.addAll({'lat': lat});
result.addAll({'lon': lon});
result.addAll({'displayName': displayName});
return result;
}
String toJson() => json.encode(toMap());
factory AddressModel.fromJson(String source) =>
AddressModel.fromMap(json.decode(source));
@override
String toString() {
return 'AddressModel(placeId: $placeId, lat: $lat, lon: $lon, displayName: $displayName)';
}
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is AddressModel &&
other.placeId == placeId &&
other.lat == lat &&
other.lon == lon &&
other.displayName == displayName;
}
@override
int get hashCode {
return placeId.hashCode ^
lat.hashCode ^
lon.hashCode ^
displayName.hashCode;
}
}
发出 HTTP 请求后,我从 API 获取数据。所以我不需要将这些数据存储在我的 redux 存储中。 (我使用 flutter redux)但是我期望的数据类型是 AddressModel 所以我像这样转换我的数据。
final List addressList = json.decode(response.body);
List<AddressModel> addresses = addressList.map((e) {
AddressModel addressModel = AddressModel.fromMap(e);
return addressModel;
}).toList();
但是在我打印我的地址后,它没有打印。地址列表正在打印我的预期值。 几个小时以来我一直试图找出我这边出了什么问题。但我不能。因为我的代码对我来说看起来没问题。有人可以帮我解决这个问题吗?
你可以尝试像这样将类型添加到地图函数中吗?
List<AddressModel> addresses = addressList.map<AddressModel>((e) {
AddressModel addressModel = AddressModel.fromMap(e);
return addressModel;
}).toList();
顺便说一句,你可以写得更短,比如
List<AddressModel> addresses = addressList.map<AddressModel>((e) => AddressModel.fromMap(e)).toList();
以下是需要解决的问题:
String
是通过调用预期 parse
类型的 tryParse
或 num
方法来完成的。例如,您可以执行 int.parse('2')
或 double.parse('3.0')
。map['placeId']
替换为 map['place_id']
。place_id
,因为它已经是json中的数字了。所以
AddressModel.fromMap
工厂构造函数应该是这样的:
factory AddressModel.fromMap(Map<String, dynamic> map) {
return AddressModel(
placeId: map['place_id'] ?? 0,
lat: double.tryParse(map['lat']) ?? 0.0,
lon: double.tryParse(map['lon']) ?? 0.0,
displayName: map['displayName'] ?? '',
);
}