Flutter中用locationFromAddress替换placemarkFromCoordinates获取经纬度
从地址转换获取经纬度的Flutter代码修改方案
原来的代码是通过经纬度逆向解析地址,现在我们调整为通过用户输入的地址正向解析经纬度,核心是使用locationFromAddress()方法替代placemarkFromCoordinates(),具体修改如下:
1. 调整变量定义
新增用户输入地址的变量,以及存储经纬度的变量:
String _inputAddress = ""; // 用户输入的目标地址 LatLng? _position; // 存储解析得到的经纬度
2. 修改核心方法
重写方法逻辑,调用locationFromAddress()解析地址并提取经纬度:
void _getCoordinatesFromAddress() async { try { // 通过输入地址解析经纬度,返回Location列表 List<Location> locations = await _geolocator.locationFromAddress(_inputAddress); if (locations.isNotEmpty) { Location location = locations[0]; // 提取经纬度 double latitude = location.latitude; double longitude = location.longitude; print("解析得到的经纬度: $latitude, $longitude"); setState(() { _position = LatLng(latitude, longitude); // 更新经纬度状态 }); } else { print("未找到匹配的地址"); } } catch (e) { print("地址解析失败: $e"); } }
关键说明
locationFromAddress()接收一个字符串类型的地址参数,返回List<Location>,通常取第一个元素即可得到目标经纬度- 加入
try-catch捕获解析异常,避免因地址无效或网络问题导致崩溃 - 需要确保
_geolocator实例已正确初始化,且相关权限(如网络权限)已配置
完整示例代码(结合输入场景)
如果需要结合用户输入框,完整代码示例如下:
import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; class AddressToCoordinatesPage extends StatefulWidget { const AddressToCoordinatesPage({super.key}); @override State<AddressToCoordinatesPage> createState() => _AddressToCoordinatesPageState(); } class _AddressToCoordinatesPageState extends State<AddressToCoordinatesPage> { final GeolocatorPlatform _geolocator = GeolocatorPlatform.instance; String _inputAddress = ""; LatLng? _position; void _getCoordinatesFromAddress() async { try { List<Location> locations = await _geolocator.locationFromAddress(_inputAddress); if (locations.isNotEmpty) { Location location = locations[0]; setState(() { _position = LatLng(location.latitude, location.longitude); }); } else { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("未找到匹配的地址")), ); } } catch (e) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("地址解析失败: $e")), ); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("地址转经纬度")), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ TextField( onChanged: (value) { setState(() { _inputAddress = value; }); }, decoration: const InputDecoration( hintText: "输入目标地址", border: OutlineInputBorder(), ), ), const SizedBox(height: 16), ElevatedButton( onPressed: _inputAddress.isNotEmpty ? _getCoordinatesFromAddress : null, child: const Text("获取经纬度"), ), const SizedBox(height: 16), if (_position != null) Text("解析结果: 纬度${_position!.latitude}, 经度${_position!.longitude}"), ], ), ), ); } }
内容的提问来源于stack exchange,提问作者Unknown Programmer
相关产品推荐
相关产品推荐

