Flutter地理位置与Firestore集成插件geo_firestore_flutter的使用
Flutter地理位置与Firestore集成插件geo_firestore_flutter
的使用
简介
GeoFirestore
是一个用于在 Firestore 数据库中进行基于位置查询的 Flutter 实现。它允许开发者存储和检索地理位置数据,并根据地理区域创建查询。本文将介绍如何使用 geo_firestore_flutter
插件来实现这些功能。
GeoFirestore 对象
创建 GeoFirestore 实例
要创建一个新的 GeoFirestore
实例,您需要将其附加到 Firestore 集合引用:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:geo_firestore_flutter/geo_firestore_flutter.dart';
Firestore firestore = Firestore.instance;
GeoFirestore geoFirestore = GeoFirestore(firestore.collection('places'));
设置位置数据
要设置文档的位置,只需调用 setLocation
方法:
await geoFirestore.setLocation('tl0Lw0NUddQx5a8kXymO', GeoPoint(37.7853889, -122.4056973));
要删除某个位置并从数据库中删除该位置,可以调用:
await geoFirestore.removeLocation('tl0Lw0NUddQx5a8kXymO');
检索位置
如果文档不在 GeoFirestore
中,回调将返回 null
。如果发生错误,回调将传递错误且位置为 null
:
final location = await geoFirestore.getLocation('tl0Lw0NUddQx5a8kXymO');
print('Location for this document is ${location.latitude}, ${location.longitude}');
地理查询
GeoFirestore
允许您使用 getAtLocation
方法查询地理区域内所有文档:
final queryLocation = GeoPoint(37.7853889, -122.4056973);
// 创建一个以 [37.7832, -122.4056] 为中心、半径为 0.6 公里的新查询
final List<DocumentSnapshot> documents = await geoFirestore.getAtLocation(queryLocation, 0.6);
documents.forEach((document) {
print(document.data());
});
数据库结构
GeoFirestore
读写 Firestore 对象中的两个字段:“g”(geohash)和 “l”(纬度/经度):
{
"g": "dr8vyzzwqd",
"l": [
43.2419,
-77.3881
]
}
此库主要灵感来源于 GeoFirestore-Android。
示例 Demo
下面是一个完整的示例代码,展示了如何使用 geo_firestore_flutter
插件:
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:geo_firestore_flutter/geo_firestore_flutter.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化 Firestore 和 GeoFirestore
Firestore firestore = Firestore.instance;
GeoFirestore geoFirestore = GeoFirestore(firestore.collection('places'));
runApp(MyApp(geoFirestore: geoFirestore));
}
class MyApp extends StatelessWidget {
final GeoFirestore geoFirestore;
MyApp({required this.geoFirestore});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('GeoFirestore Example')),
body: Center(
child: ElevatedButton(
onPressed: () async {
// 设置位置
await geoFirestore.setLocation('placeId1', GeoPoint(37.7853889, -122.4056973));
// 获取位置
final location = await geoFirestore.getLocation('placeId1');
if (location != null) {
print('Location for placeId1 is ${location.latitude}, ${location.longitude}');
} else {
print('Location not found for placeId1');
}
// 查询附近地点
final queryLocation = GeoPoint(37.7853889, -122.4056973);
final List<DocumentSnapshot> nearbyPlaces = await geoFirestore.getAtLocation(queryLocation, 0.6);
nearbyPlaces.forEach((doc) {
print(doc.data());
});
},
child: Text('Run GeoFirestore Demo'),
),
),
),
);
}
}
更多关于Flutter地理位置与Firestore集成插件geo_firestore_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复