Flutter地图选择插件map_picker的使用
Flutter地图选择插件map_picker的使用
简介
Map Pin Picker
是一个无需依赖特定供应商的地图库,旨在提供简单快捷的地图选择功能。它完全由Dart编写,所有代码位于 GitHub仓库的/lib文件夹 中。
功能展示
安装
在你的 pubspec.yaml
文件的 dependencies:
部分添加如下行:
map_pin_picker: <latest_version>
使用方法
导入类
首先确保导入必要的包:
import 'package:map_pin_picker/map_pin_picker.dart';
示例代码
下面是一个完整的示例,展示了如何使用 MapPicker
来实现地图选择功能:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:map_picker/map_picker.dart';
import 'package:geocoding/geocoding.dart';
import 'package:flutter_svg/flutter_svg.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _controller = Completer<GoogleMapController>();
MapPickerController mapPickerController = MapPickerController();
CameraPosition cameraPosition = const CameraPosition(
target: LatLng(41.311158, 69.279737),
zoom: 14.4746,
);
var textController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
alignment: Alignment.topCenter,
children: [
MapPicker(
// 自定义图标
iconWidget: SvgPicture.asset(
"assets/location_icon.svg",
height: 60,
),
// 添加地图控制器
mapPickerController: mapPickerController,
child: GoogleMap(
myLocationEnabled: true,
zoomControlsEnabled: false,
myLocationButtonEnabled: false,
mapType: MapType.normal,
initialCameraPosition: cameraPosition,
onMapCreated: (GoogleMapController controller) {
_controller.complete(controller);
},
onCameraMoveStarted: () {
mapPickerController.mapMoving!();
textController.text = "checking ...";
},
onCameraMove: (cameraPosition) {
this.cameraPosition = cameraPosition;
},
onCameraIdle: () async {
mapPickerController.mapFinishedMoving!();
List<Placemark> placemarks = await placemarkFromCoordinates(
cameraPosition.target.latitude,
cameraPosition.target.longitude,
);
textController.text =
'${placemarks.first.name}, ${placemarks.first.administrativeArea}, ${placemarks.first.country}';
},
),
),
Positioned(
top: MediaQuery.of(context).viewPadding.top + 20,
width: MediaQuery.of(context).size.width - 50,
height: 50,
child: TextFormField(
maxLines: 3,
textAlign: TextAlign.center,
readOnly: true,
decoration: const InputDecoration(
contentPadding: EdgeInsets.zero, border: InputBorder.none),
controller: textController,
),
),
Positioned(
bottom: 24,
left: 24,
right: 24,
child: SizedBox(
height: 50,
child: TextButton(
child: const Text(
"Submit",
style: TextStyle(
fontWeight: FontWeight.w400,
color: Colors.white,
fontSize: 19,
),
),
onPressed: () {
print("Location ${cameraPosition.target.latitude} ${cameraPosition.target.longitude}");
print("Address: ${textController.text}");
},
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all<Color>(Colors.red),
shape: MaterialStateProperty.all<RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15.0),
),
),
),
),
),
)
],
),
);
}
}
自定义和属性
MapPicker
提供了一些可自定义的属性,例如:
- child: 地图组件,默认为
GoogleMap
- iconWidget: 图标组件,默认为定位图标
- mapPickerController: 地图控制器
- showDot: 是否显示小圆点,默认为
true
贡献者
感谢以下贡献者的支持:
许可证
本项目采用 MIT 许可证,详情请参阅 LICENSE 文件。
开始使用
更多关于Flutter的帮助信息,请访问 Flutter官方文档。有关编辑包代码的帮助,请查看 开发包文档。
更多关于Flutter地图选择插件map_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地图选择插件map_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用map_picker
插件来选择地图位置的一个基本示例。map_picker
插件允许用户在地图上选择一个位置,并返回该位置的经纬度信息。
首先,确保你已经在pubspec.yaml
文件中添加了map_picker
依赖:
dependencies:
flutter:
sdk: flutter
map_picker: ^x.y.z # 请替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤使用map_picker
:
- 导入必要的包:
import 'package:flutter/material.dart';
import 'package:map_picker/map_picker.dart';
- 创建地图选择器页面:
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Map Picker Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MapPickerExample(),
);
}
}
class MapPickerExample extends StatefulWidget {
@override
_MapPickerExampleState createState() => _MapPickerExampleState();
}
class _MapPickerExampleState extends State<MapPickerExample> {
LatLng? selectedLocation;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Map Picker Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
selectedLocation != null
? 'Selected Location: ${selectedLocation!.latitude}, ${selectedLocation!.longitude}'
: 'No location selected',
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
final result = await MapPicker.platform.pickLocation(
context,
apiKey: 'YOUR_GOOGLE_MAPS_API_KEY', // 替换为你的Google Maps API Key
);
if (result != null) {
setState(() {
selectedLocation = result;
});
}
},
child: Text('Select Location'),
),
],
),
),
);
}
}
在上面的代码中,我们创建了一个简单的Flutter应用,它包含一个按钮,用户点击该按钮后,会打开一个地图选择器来选择位置。一旦用户选择了位置,应用会更新显示所选位置的经纬度。
请注意以下几点:
- 你需要替换
YOUR_GOOGLE_MAPS_API_KEY
为你的Google Maps API Key。你可以通过Google Cloud Platform获取这个Key。 MapPicker.platform.pickLocation
方法会返回一个LatLng
对象,该对象包含所选位置的经纬度信息。setState
方法用于更新UI,以显示所选位置的信息。
这个示例应该能帮助你开始在Flutter项目中使用map_picker
插件。如果你需要更多高级功能,请参考map_picker
的官方文档。