如何使用dart json_serializable软件包序列化GeoPoint

时间:2020-05-10 04:49:11

标签: firebase flutter google-cloud-firestore

我正在尝试使用以下软件包按距离过滤我的Firestore集合。

https://github.com/fluttercommunity/firestore_helpers

以他们的示例为例,他们使用jaguar_serializer将从Firestore接收的数据转换为Location类。我已经在我的应用程序中实现了他们的getDataInArea函数,但是由于我使用的是json_serializable,因此我目前陷入困境。

我环顾四周,发现在下面的链接中有一个关于如何使用Geo_value处理GeoPoint的建议。

https://github.com/google/built_value.dart/issues/417#issuecomment-391661750

所以我想知道是否有一种方法可以实现类似于jaguar_serializer和Built_value中显示的内容,但是可以使用json_serializable包代替。

我猜测一种方法是使用@JsonKey(fromJson: , toJson: ),但我不太确定该怎么做。

3 个答案:

答案 0 :(得分:3)

经过更多的挖掘并试图了解事物的工作方式。通过在课堂上写下以下内容,我设法解决了问题。

  @JsonKey(fromJson: _fromJsonGeoPoint, toJson: _toJsonGeoPoint)
  GeoPoint location;

  static GeoPoint _fromJsonGeoPoint(GeoPoint geoPoint) {
    return geoPoint;
  }

  static GeoPoint _toJsonGeoPoint(GeoPoint geoPoint) {
    return geoPoint;
  }

我想这个想法只是不对GeoPoint对象进行任何更改。无论如何,我想听到这是正确的方法,或者有更好的方法可以做到这一点。干杯!

答案 1 :(得分:0)

您的解决方案对我不起作用。例如,如果您尝试在对象上使用 jsonEncode,它将失败。欢迎其他人反馈。这是我的建议:

@JsonKey(fromJson: _fromJsonGeoPoint, toJson: _toJsonGeoPoint)
GeoPoint position;

static GeoPoint _fromJsonGeoPoint(GeoPoint geoPoint) { return geoPoint; }

///A Map should be returned here to properly generate the json
static Map<String, dynamic> _toJsonGeoPoint(GeoPoint geoPoint) {
return {"latitude": geoPoint.latitude, "longitude":
geoPoint.longitude};
}

答案 2 :(得分:0)

Firestore 返回的类型是 GeoPoint,你可以直接通过 使用 JsonConverter:

class GeoPointConverter
    implements JsonConverter<GeoPoint, GeoPoint> {
  const GeoPointConverter();

  @override
  GeoPoint fromJson(GeoPoint geoPoint) {
    return geoPoint;
  }

  @override
  GeoPoint toJson(GeoPoint geoPoint) =>
      geoPoint;
}

之后,注释您的参数: @GeoPointConverter() required GeoPoint location