地图组件
地图组件用于集成地图功能,包括显示地图、添加标记、定位等。
提示:使用地图组件需要申请相应的 API 密钥和配置平台权限。
📱 渲染效果预览
📍
Google Maps
Google Maps 提供完整的地图功能和丰富的 API。
import 'package:google_maps_flutter/google_maps_flutter.dart';
class MyMap extends StatefulWidget {
@override
_MyMapState createState() => _MyMapState();
}
class _MyMapState extends State {
late GoogleMapController mapController;
final LatLng _center = const LatLng(45.521563, -122.677433);
void _onMapCreated(GoogleMapController controller) {
mapController = controller;
}
@override
Widget build(BuildContext context) {
return GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
target: _center,
zoom: 11.0,
),
markers: {
Marker(
markerId: MarkerId('marker_1'),
position: _center,
infoWindow: InfoWindow(
title: 'Portland',
snippet: 'Oregon, USA',
),
),
},
);
}
}
📱 渲染效果预览
📍
📍
flutter_map
flutter_map 是一个开源的地图库,基于 Leaflet。
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart';
FlutterMap(
options: MapOptions(
center: LatLng(51.5, -0.09),
zoom: 13.0,
),
children: [
TileLayer(
urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
subdomains: ['a', 'b', 'c'],
),
MarkerLayer(
markers: [
Marker(
width: 80.0,
height: 80.0,
point: LatLng(51.5, -0.09),
builder: (ctx) => Container(
child: FlutterLogo(),
),
),
],
),
],
)
Mapbox
Mapbox 提供高度可定制的地图解决方案。
import 'package:mapbox_gl/mapbox_gl.dart';
MapboxMap(
accessToken: 'YOUR_ACCESS_TOKEN',
initialCameraPosition: CameraPosition(
target: LatLng(45.521563, -122.677433),
zoom: 11.0,
),
styleString: MapboxStyles.MAPBOX_STREETS,
onMapCreated: _onMapCreated,
onStyleLoadedCallback: _onStyleLoaded,
)
📱 渲染效果预览
39.9042° N
纬度
116.4074° E
经度
1.2 km
距离
Geolocator
Geolocator 用于获取设备位置信息。
import 'package:geolocator/geolocator.dart';
// 检查位置权限
LocationPermission permission = await Geolocator.checkPermission();
if (permission == LocationPermission.denied) {
permission = await Geolocator.requestPermission();
}
// 获取当前位置
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high,
);
// 监听位置变化
StreamSubscription positionStream =
Geolocator.getPositionStream().listen((Position position) {
print(position.latitude);
print(position.longitude);
});
// 计算距离
double distanceInMeters = Geolocator.distanceBetween(
startLatitude, startLongitude,
endLatitude, endLongitude,
);
📱 渲染效果预览
Gronausestraat 710, Enschede
→
52.2165157, 6.9437893
52.2165157, 6.9437893
→
Gronausestraat 710, Enschede
Geocoding
Geocoding 用于地址和坐标之间的转换。
import 'package:geocoding/geocoding.dart';
// 地址转坐标
List locations = await locationFromAddress('Gronausestraat 710, Enschede');
// 坐标转地址
List placemarks = await placemarkFromCoordinates(52.2165157, 6.9437893);
// 获取详细信息
Placemark place = placemarks[0];
print('${place.street}, ${place.locality}, ${place.postalCode}');
地图组件选择:
- Google Maps: 功能全面、API 丰富
- flutter_map: 开源免费、基于 Leaflet
- Mapbox: 高度可定制、样式灵活
注意事项:
- 需要申请 API 密钥
- 配置平台权限(Android/iOS)
- 注意 API 使用配额和费用
- 测试时使用调试密钥