如何将Geolocator获取的经纬度赋值到Firestore的location字段
问题:如何将Geolocator获取的经纬度存入Firestore的GeoPoint字段?
我使用Geolocator实现了获取当前位置的函数:
import 'package:geolocator/geolocator.dart'; Future<Position> determinePosition() async { LocationPermission permission; permission = await Geolocator.checkPermission(); if (permission == LocationPermission.denied) { permission = await Geolocator.requestPermission(); if (permission == LocationPermission.denied) { return Future.error('Location permissions are denied'); } } if (permission == LocationPermission.deniedForever) { return Future.error( 'Location permissions are permanently denied, we cannot request permissions.'); } Position position = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.high); return position; }
该函数可返回经纬度信息,但我无法将其赋值到Firestore的location字段中,相关代码如下:
final crab = <String, Object>{ "species": label, "edibility": edibility, "location": GeoPoint() // 想把定位结果放在这里 "timestamp": Timestamp.now() }; FirebaseFirestore.instance.collection('crabData').add(crab);
请问该如何实现将获取到的经纬度赋值到该字段?
解决方案
核心是先异步获取定位数据,再用经纬度实例化GeoPoint对象,步骤如下:
- 确保代码在异步函数中执行(因为要使用
await调用异步的determinePosition()) - 调用
determinePosition()获取位置,处理可能的权限错误 - 用Position的
latitude和longitude创建GeoPoint,赋值给crab的location字段
完整示例代码:
// 放在异步函数中,比如按钮点击事件或其他异步上下文 Future<void> saveCrabData(String label, String edibility) async { try { // 1. 获取定位数据 Position position = await determinePosition(); // 2. 用经纬度创建GeoPoint GeoPoint location = GeoPoint(position.latitude, position.longitude); // 3. 构建数据并写入Firestore final crab = <String, Object>{ "species": label, "edibility": edibility, "location": location, "timestamp": Timestamp.now() }; await FirebaseFirestore.instance.collection('crabData').add(crab); print("数据保存成功"); } catch (e) { // 处理定位权限错误或Firestore写入错误 print("保存失败:$e"); } }
注意事项
- 必须在异步函数中使用
await,否则无法获取到Position的实际值 - 要处理
determinePosition()抛出的权限错误,避免程序崩溃 GeoPoint的参数顺序是纬度(latitude)在前,经度(longitude)在后,不要搞反
内容的提问来源于stack exchange,提问作者Keannu Gran
相关产品推荐
相关产品推荐

