用于 Geopoint 的 Flutter Hive 适配器

Posted

技术标签:

【中文标题】用于 Geopoint 的 Flutter Hive 适配器【英文标题】:Flutter Hive Adapter for Geopoint 【发布时间】:2020-10-31 20:46:27 【问题描述】:

我在 firestore 中存储了一个地理点,并尝试使用我的 Hive 适配器检索它。但是,我得到了

Cannot write, unknown type: GeoPoint. Did you forget to register an adapter?

我正在注册适配器,所以这不是问题。是数据的地理点部分。

这是我的蜂巢场

@HiveField(5)
  Map<String, dynamic> location;

这就是它在我的 Firestore 数据库中的样子

有没有人遇到过这个问题,或者有办法创建一个适配器供 Hive/Firestore 使用?

【问题讨论】:

其实我想我缩小了我的问题。我需要为 GeoPoint(外部源文件)创建一个适配器,但我不知道如何完成。 【参考方案1】:

要创建 Gepoint 适配器,您需要有一个可以适应的模型。 我不确定您如何处理存储在该地理点中的数据,我想我会以某种方式简单地解析数据。 所以我假设这个模型:

import 'package:hive/hive.dart';

part 'location.g.dart';

@HiveType(typeId: 0)
class Location 
  @HiveField(0)
  String geohash;

  @HiveField(1)
  GeoPoint geoPoint;

  @HiveField(2)
  String locationPreviewURL;

注意部分'location.g.dart';。 生成器最终将使用它来创建适配器。

为包含 Hive 可以处理的类型的 GeoPoint 创建一个模型,因此我假设您的值的地理数据部分现在是一个字符串。 您需要决定如何处理该类型的值。 我现在将重点介绍适配器部分。

import 'package:hive/hive.dart';

part 'geopoint.g.dart';

@HiveType(typeId: 1)
class GeoPoint 
  @HiveField(0)
  String geodata;


准备好之后,转到您的终端并运行

flutter packages pub run build_runner build

创建适配器。 请注意,当您更改 HiveModels 时,您需要重新创建它们。 你应该使用

flutter packages pub run build_runner build --delete-conflicting-outputs

为此。

最后,您需要注册您的适配器,以便 Hive 可以使用它们。 所以在打开任何盒子之前,通常是在初始化应用调用时

Hive.registerAdapter(LocationAdapter());
Hive.registerAdapter(GeoPointAdapter());

【讨论】:

以上是关于用于 Geopoint 的 Flutter Hive 适配器的主要内容,如果未能解决你的问题,请参考以下文章

解析云代码 GeoPoint

具有纬度/经度值的 Android GeoPoint

使用 python 在 Firestore 中的 GeoPoint

HIV组件

如何在 iOS 版 Facebook SDK 中定义“GeoPoint”属性

使用python在Firestore中运行GeoPoint