Flutter地图选点插件google_maps_pick_place的使用

Flutter 地图选点插件 google_maps_pick_place 的使用

Google Maps Pick Place

这是一个用于从谷歌地图上选择地点并使用所选数据的应用程序的 pub.dev 插件。

  • 🌟 简单易用 🌟
  • 🚀 节省大量时间 🚀
  • ✨ 像魔法一样 ✨

关注我

LinkedIn | GitHub | GitHub 仓库 | Pub

特性

  • 从谷歌地图上选择一个地点
  • 搜索特定地点
  • 使用 GPS 和当前位置
  • 新的可自定义的设计
  • 处理断开连接的情况
  • 处理拒绝 GPS 访问的情况

预览

预览

开始使用

获取 API 密钥

访问 https://cloud.google.com/maps-platform/ 获取 API 密钥。

启用 Google Map SDK

  1. 打开 Google 开发者控制台
  2. 选择你要启用 Google Maps 的项目。
  3. 选择导航菜单中的 “Google Maps”。
  4. 选择 “APIs”。
  5. 若要为 Android 启用 Google Maps,在 “附加 API” 部分选择 “Maps SDK for Android” 并点击 “启用”。
  6. 若要为 iOS 启用 Google Maps,在 “附加 API” 部分选择 “Maps SDK for iOS” 并点击 “启用”。
  7. 确保已启用的 API 在 “已启用的 API” 部分。

更多详情请参阅 Google Maps Platform 入门指南

Android 设置

  1. android/app/build.gradle 中设置 minSdkVersion
android {
    defaultConfig {
        minSdkVersion 20
    }
}

这表示应用程序仅适用于运行 Android SDK 20 或更高版本的用户。

  1. 确保在 android/app/build.gradle 文件中将 compileSdkVersion 设置为 31:
android {
 compileSdkVersion 31

 ...
}
  1. 在应用清单文件 android/app/src/main/AndroidManifest.xml 中指定你的 API 密钥:
<manifest ...
  <application ...
    <meta-data android:name="com.google.android.geo.API_KEY"
               android:value="YOUR KEY HERE"/>
  1. gradle.properties 文件中添加以下内容:
android.useAndroidX=true
android.enableJetifier=true
  1. 确保你将所有 android. 依赖项替换为其对应的 AndroidX 版本(完整的列表可以在 Android 迁移指南 中找到)。

Hybrid Composition

要使用 Hybrid Composition 在 Android 上渲染 GoogleMap 小部件,请将 AndroidGoogleMapsFlutter.useAndroidViewSurface 设置为 true

if (defaultTargetPlatform == TargetPlatform.android) {
  AndroidGoogleMapsFlutter.useAndroidViewSurface = true;
}

iOS 设置

要在 iOS 上进行设置,请在应用代理 ios/Runner/AppDelegate.m 中指定你的 API 密钥:

#import "AppDelegate.h"
#import "GeneratedPluginRegistrant.h"
#import "GoogleMaps/GoogleMaps.h"

@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [GMSServices provideAPIKey:@"YOUR KEY HERE"];
  [GeneratedPluginRegistrant registerWithRegistry:self];
  return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end

或者在 Swift 代码中,指定你的 API 密钥在应用代理 ios/Runner/AppDelegate.swift 中:

import UIKit
import Flutter
import GoogleMaps

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GMSServices.provideAPIKey("YOUR KEY HERE")
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

在 iOS 上,你需要向你的 Info.plist 文件(位于 ios/Runner 下)添加以下条目以访问设备的位置。

只需打开你的 Info.plist 文件并添加以下内容:

<key>NSLocationWhenInUseUsageDescription</key>
<string>该应用在使用时需要位置权限。</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>该应用在后台运行时需要位置权限。</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>该应用在使用时和后台运行时都需要位置权限。</string>

此外,你需要将 Background Modes 功能添加到你的 XCode 项目中(项目 > 签名和功能 > “+” 按钮),然后选择 Location Updates

通过在应用的 Info.plist 文件中添加一个布尔属性,启用嵌入式视图预览,键名为 io.flutter.embedded_views_preview,值为 YES

<key>io.flutter.embedded_views_preview</key>
<true/>

使用方法

基本用法

你可以通过使用 Navigator 推入一个新的页面,或者将其作为任何小部件的子节点来使用 GoogleMapsPickPlace。当用户在地图上选择一个地点时,它会返回结果给 getResult 方法,类型为 FullAddress

import 'package:flutter/material.dart';
import 'package:google_maps_pick_place/google_maps_pick_place.dart';

// ...
Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => GoogleMapsPickPlace(
          apiKey: "YOU GOOGLE MAPS API KEY",
          getResult: (FullAddress result) {
            print('${result.address}');
            /// 不要使用 Navigator.of(context).pop(),因为它已在方法中构建
          },
        ),
      ),
    );

注意事项

搜索地点的功能需要付费的 Google Maps API 密钥。使用免费密钥时,地图和选择地点的功能可以正常工作且不会出现错误,但搜索地点的功能将无法使用。

Google Maps Pick Place 属性

参数名称 类型 描述
apiKey String Google Maps API 密钥
mapLanguage Language 地图使用的语言
getResult Function 获取地址和位置的方法
initialPosition LatLng 如果没有位置且 GPS 关闭,则地图的初始位置
enableMyLocationButton bool 启用或禁用我的位置按钮
enableSearchButton bool 启用或禁用搜索按钮
loader Widget 地图加载时显示的小部件
doneButton Widget? 地图加载完成并应用 getResult 方法时显示的小部件
errorButton Widget? 出现错误或无网络连接时显示的小部件
zoomFactor double 地图的缩放因子(默认为 5.0)
markerColor MarkerColor 地图标记的颜色(默认为红色)

FullAddress 属性

参数名称 类型 描述
address String? 格式化的地址
position Position? 地址的位置

许可证

MIT 许可证

示例代码

以下是使用 google_maps_pick_place 插件的基本示例代码:

import 'package:flutter/material.dart';
import 'package:google_maps_pick_place/google_maps_pick_place.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Google Maps Pick Place Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Google Maps Pick Place Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  String address = "";
  double latitude = 0.0;
  double longitude = 0.0;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        elevation: 0.0,
        centerTitle: true,
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              'Address: $address',
            ),
            Text(
              'Latitude: $latitude ',
            ),
            Text(
              'Longitude: $longitude',
            ),
            RaisedButton(
              color: Colors.blue,
              elevation: 0.0,
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => GoogleMapsPickPlace(
                      apiKey: 'YOUR_GOOGLE_MAPS_API_KEY',
                      getResult: (FullAddress fullAddress) {
                        setState(() {
                          address = fullAddress.address.toString();
                          latitude = fullAddress.position!.latitude;
                          longitude = fullAddress.position!.longitude;
                        });
                      },
                    ),
                  ),
                );
              },
              child: const Text('Pick Place'),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter地图选点插件google_maps_pick_place的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地图选点插件google_maps_pick_place的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 google_maps_pick_place 插件在 Flutter 应用中实现地图选点功能的代码示例。这个插件允许用户在 Google 地图上选择一个位置,并返回该位置的信息。

首先,确保你的 pubspec.yaml 文件中包含了必要的依赖:

dependencies:
  flutter:
    sdk: flutter
  google_maps_flutter: ^2.1.1  # Google Maps Flutter 插件
  geolocator: ^8.0.3           # 用于获取设备位置(可选)
  google_maps_pick_place: ^2.0.0  # Google Maps 选点插件

然后,运行 flutter pub get 来获取这些依赖。

接下来,在你的 Flutter 应用中实现地图选点功能。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:google_maps_pick_place/google_maps_pick_place.dart';
import 'package:geolocator/geolocator.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Map Pick Place Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MapPickPlaceScreen(),
    );
  }
}

class MapPickPlaceScreen extends StatefulWidget {
  @override
  _MapPickPlaceScreenState createState() => _MapPickPlaceScreenState();
}

class _MapPickPlaceScreenState extends State<MapPickPlaceScreen> {
  GoogleMapController? _controller;
  LatLng? _selectedPosition;
  final Set<Marker> _markers = {};
  final LatLng _center = LatLng(37.7749, -122.4194); // 默认中心点(旧金山)

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Map Pick Place Demo'),
      ),
      body: Stack(
        children: [
          GoogleMap(
            mapType: MapType.normal,
            initialCameraPosition: CameraPosition(
              target: _center,
              zoom: 14.0,
            ),
            onMapCreated: (GoogleMapController controller) {
              _controller = controller;
            },
            markers: _markers.toSet(),
          ),
          Positioned(
            bottom: 10,
            right: 10,
            child: ElevatedButton(
              onPressed: () async {
                final result = await GoogleMapsPickPlace.pickPlace(
                  context: context,
                  apiKey: 'YOUR_GOOGLE_MAPS_API_KEY', // 请替换为你的 Google Maps API Key
                  initialPosition: _center,
                  useCurrentLocation: true,
                );

                if (result != null) {
                  setState(() {
                    _selectedPosition = result.position;
                    _markers.clear();
                    _markers.add(Marker(
                      markerId: MarkerId('selected'),
                      position: _selectedPosition!,
                      infoWindow: InfoWindow(title: result.name, snippet: result.address),
                    ));
                    _controller?.animateCamera(CameraUpdate.newLatLngZoom(_selectedPosition!, 16));
                  });
                }
              },
              child: Text('Pick Place'),
            ),
          ),
        ],
      ),
    );
  }
}

在这个示例中:

  1. 我们首先引入了必要的包。
  2. 定义了 MyAppMapPickPlaceScreen 小部件。
  3. MapPickPlaceScreen 中,我们创建了一个 Google Map,并在地图上添加了一个按钮来触发位置选择。
  4. 使用 GoogleMapsPickPlace.pickPlace 方法来打开位置选择器,用户可以选择一个位置。
  5. 当用户选择一个位置后,我们将该位置标记在地图上,并更新相机的位置以聚焦到所选位置。

请确保你已经设置了 Google Maps API Key,并在 Android 和 iOS 项目中进行了相应的配置。你可以在 Google Cloud Platform 上获取你的 API Key,并按照 Flutter 官方文档中的说明将其添加到你的项目中。

回到顶部