Flutter地图选择插件map_picker的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter地图选择插件map_picker的使用

简介

Map Pin Picker 是一个无需依赖特定供应商的地图库,旨在提供简单快捷的地图选择功能。它完全由Dart编写,所有代码位于 GitHub仓库的/lib文件夹 中。

功能展示

GIF

安装

在你的 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

1 回复

更多关于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

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:map_picker/map_picker.dart';
  1. 创建地图选择器页面
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的官方文档。

回到顶部