Dart 列表<dynamic> 无法转换为列表<MyModel>

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

我是一名 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();

但是在我打印我的地址后,它没有打印。地址列表正在打印我的预期值。 几个小时以来我一直试图找出我这边出了什么问题。但我不能。因为我的代码对我来说看起来没问题。有人可以帮我解决这个问题吗?

arrays json flutter dart nsjsonserialization
2个回答
0
投票

你可以尝试像这样将类型添加到地图函数中吗?

  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();

0
投票

以下是需要解决的问题:

  • 在 Dart 中,解析
    String
    是通过调用预期
    parse
    类型的
    tryParse
    num
    方法来完成的。例如,您可以执行
    int.parse('2')
    double.parse('3.0')
  • json键位于snake_case中,因此从json映射访问键时需要保留snake_case。将
    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'] ?? '',
  );
}
© www.soinside.com 2019 - 2024. All rights reserved.