Flutter地点选择插件google_maps_place_picker的使用

Flutter地点选择插件google_maps_place_picker的使用

预览

支持

如果该插件对您有用或节省了您的时间,请不要犹豫为我买杯咖啡!😉
更多咖啡,更多的未来有用项目。

获取开始

  1. https://cloud.google.com/maps-platform/获取API密钥。
  2. 启用Google Map SDK以支持每个平台。
  3. 您可以在此处找到有关如何开始使用Google Maps平台的详细步骤:https://developers.google.com/maps/gmp-get-started
Android

在应用清单文件android/app/src/main/AndroidManifest.xml中指定您的API密钥:

<manifest ...
  <application ...
    <meta-data android:name="com.google.android.geo.API_KEY"
               android:value="YOUR KEY HERE"/>

注意: 自版本3.0.0起,geolocator插件切换到了AndroidX版本的支持库。这意味着您需要确保您的Android项目也升级到支持AndroidX。详细的说明可以在这里找到。

简化版的步骤如下:

  1. gradle.properties文件中添加以下内容:
android.useAndroidX=true
android.enableJetifier=true
  1. 确保在android/app/build.gradle文件中的compileSdkVersion设置为28:
android {
 compileSdkVersion 28

 ...
}
  1. 将所有android.依赖项替换为其AndroidX对应版本(完整列表可以在这里找到)。
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代码中,在应用程序代理文件ios/Runner/AppDelegate.swift中指定您的API密钥:

import UIKit
import Flutter
import GoogleMaps

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: 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导航到新页面,或者将其作为任何小部件的子元素使用。当用户在地图上选择一个地点时,它将通过PickResult类型返回结果到onPlacePicked回调。

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => PlacePicker(
      apiKey: APIKeys.apiKey,   // Put YOUR OWN KEY here.
      onPlacePicked: (result) { 
        print(result.address); 
        Navigator.of(context).pop();
      },
      initialPosition: HomePage.kInitialPosition,
      useCurrentLocation: true,
    ),
  ),
);
PickResult
参数 类型 描述
placeId String 唯一标识地点的文本标识符。要检索有关此地点的信息,请将此标识符传递给Places API请求的placeId字段。更多信息见PlaceId
geometry Geometry 包含关于结果的几何信息,通常包括地点的位置(地理编码)及其(可选的)标识其大致覆盖区域的视口。
formattedAddress String 该地点的人类可读地址。通常是邮政地址。
types List<String> 包含描述给定结果的特征类型的数组。参见支持的类型列表。XML响应包含多个
PlacePicker
参数 类型 描述
apiKey String (必需) 您的谷歌地图API密钥
onPlacePicked Callback(PickResult) 当用户选择地点并确认使用时调用。如果您手动构建selectedPlaceWidgetBuilder,则不会调用此回调,因为这会覆盖默认的“选择此处”按钮。
initialPosition LatLng (必需) 创建谷歌地图时的初始中心位置。如果useCurrentLocation设置为true,则将尝试使用GeoLocator获取设备的当前位置。
useCurrentLocation bool 是否使用设备的当前位置作为初始中心位置。如果设置为true且用户允许收集他们的位置,则将使用当前位置而不是初始位置。
desiredLocationAccuracy LocationAccuracy 获取当前位置的精度。默认为“高”。
hintText String 搜索栏的提示文本
searchingText String 搜索执行时出现的文本。默认为“正在搜索…”
proxyBaseUrl String 用于谷歌地图上的API调用。如果使用代理,则可以设置baseUrl。在这种情况下,不需要在代理中设置apiKey。
httpClient Client 用于谷歌地图上的API调用。如果使用需要认证或自定义配置的代理URL。
autoCompleteDebounceInMilliseconds int 自动完成输入的去抖动计时器。默认为500
cameraMoveDebounceInMilliseconds int 拖动地图进行搜索的去抖动计时器。默认为750
intialMapType MapType 谷歌地图的地图类型。默认为正常。
enableMapTypeButton bool 是否在地图上显示更改地图类型的按钮
enableMyLocationButton bool 是否在地图上显示我的位置按钮
usePinPointingSearch bool 默认为true。这将允许用户拖动地图并获取指针指向位置的信息。
usePlaceDetailSearch bool 默认为false。设置为true时,将从拖动地图进行搜索获取详细结果,但将在Place Detail API上使用+1个请求。
onAutoCompleteFailed Callback(String) 当自动完成搜索失败时调用
onGeocodingSearchFailed Callback(String) 当通过拖动地图进行搜索失败时调用
onMapCreated MapCreatedCallback 返回创建的谷歌地图控制器
selectedPlaceWidgetBuilder WidgetBuilder 详见下文
pinBuilder WidgetBuilder 详见下文
autocompleteOffset num 输入项中最后一个字符的位置,服务用于匹配预测
autocompleteRadius num 返回地点结果的距离(米)
autocompleteLanguage String 语言代码,指示结果应以哪种语言返回(如果可能)。
autocompleteComponents List<Components> 分组的地点,您希望限制结果。目前,您可以使用组件按最多5个国家进行过滤。
autocompleteTypes List<String> 要返回的地点结果类型。参见Place Types
strictbounds bool 仅返回严格位于由location和radius定义的区域内的地点。
region String 地区代码,以ccTLD(国家顶级域名)两个字符表示。大多数ccTLD代码与ISO 3166-1代码相同,但有些例外。此参数将影响(但不完全限制)搜索结果。如果在指定区域内存在更相关的结果,它们可能会被包含。
selectInitialPosition bool 是否在初始地图加载时显示所选地点。默认为false。
resizeToAvoidBottomInset bool 参考Scaffold的resizeToAvoidBottomInset属性。
initialSearchString String 设置自动完成搜索的初始搜索字符串
searchForInitialValue bool 是否在启动时自动搜索初始值
forceAndroidLocationManager bool 对于Android设备,您可以将其设置为true以强制geolocator插件使用’LocationManager’确定位置,而不是’FusedLocationProviderClient’。在iOS上忽略此设置。
myLocationButtonCooldown int 'myLocationButton’的冷却时间(秒)。默认为10秒。
forceSearchOnZoomChanged bool 是否允许在缩放改变时进行地点搜索。默认为false。
automaticallyImplyAppBarLeading bool 默认情况下,顶部有一个后退按钮。设置为false将移除后退按钮。
autocompleteOnTrailingWhitespace bool 是否允许在搜索结束时的空白处运行自动完成功能。默认为false。参考问题#54。
自定义所选地点可视化

默认情况下,当用户通过自动完成搜索或拖动地图选择一个地点时,我们会将信息显示在屏幕底部(FloatingCard)。

但是,如果您不喜欢这种UI/UX,可以通过selectedPlaceWidgetBuilder重写构建器。您可以重复使用FloatingCard小部件,使其浮动在屏幕上,或者根据需要构建全新的小部件。它堆叠在地图上,因此您可能需要使用Positioned小部件。

注意: 使用此定制不会调用[onPlacePicked]回调,因为它会覆盖默认的浮动卡片上的“选择此处”按钮。

PlacePicker(
  apiKey: APIKeys.apiKey,
  ...
  selectedPlaceWidgetBuilder: (_, selectedPlace, state, isSearchBarFocused) {
    return isSearchBarFocused
        ? Container()
        // 使用FloatingCard或创建自己的小部件。
        : FloatingCard(
            bottomPosition: 0.0,    // MediaQuery.of(context)将导致重建。请参阅MediaQuery文档了解更多信息。
            leftPosition: 0.0,
            rightPosition: 0.0,
            width: 500,
            borderRadius: BorderRadius.circular(12.0),
            child: state == SearchingState.Searching 
                            ? Center(child: CircularProgressIndicator()) 
                            : RaisedButton(onPressed: () { 
                              print("do something with [selectedPlace] data"); 
                            },),
         );
  },
  ...
),
参数 类型 描述
context BuildContext Flutter的构建上下文值
selectedPlace PickResult 用户选择地点的结果数据
state SearchingState 搜索操作的状态。(空闲,搜索中)
isSearchBarFocused bool 是否当前搜索栏已聚焦,键盘已显示
自定义定位图标

默认情况下,定位图标提供了一个简单的拾取动画。然而,您也可以使用pinBuilder创建自己的定位图标。

PlacePicker(
  apiKey: APIKeys.apiKey,
  ...
  pinBuilder: (context, state) {
    if (state == PinState.Idle) {
      return Icon(Icons.favorite_border);
    } else {
      return AnimatedIcon(...);
    }
  },
  ...
),
参数 类型 描述
context BuildContext Flutter的构建上下文值
state PinState 定位状态。(准备中;地图加载时,空闲,拖动)
更改默认FloatingCard的颜色

虽然您可以构建自己的预测磁贴,但您仍然可以使用themeData更改默认磁贴的样式,如下所示:

// Light Theme
final ThemeData lightTheme = ThemeData.light().copyWith(
  // FloatingCard的背景颜色
  cardColor: Colors.white,
  buttonTheme: ButtonThemeData(
    // “选择此处”按钮的颜色
    buttonColor: Colors.black,
    textTheme: ButtonTextTheme.primary,
  ),
);

// Dark Theme
final ThemeData darkTheme = ThemeData.dark().copyWith(
  // FloatingCard的背景颜色
  cardColor: Colors.grey,
  buttonTheme: ButtonThemeData(
    // “选择此处”按钮的颜色
    buttonColor: Colors.yellow,
    textTheme: ButtonTextTheme.primary,
  ),
);

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

1 回复

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


google_maps_place_picker 是一个用于在 Flutter 应用中选择地点的插件,它集成了 Google Maps Place Picker 功能,允许用户在地图上选择一个地点,并返回该地点的详细信息。以下是如何使用 google_maps_place_picker 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 google_maps_place_picker 依赖:

dependencies:
  flutter:
    sdk: flutter
  google_maps_place_picker: ^1.0.0+1

然后运行 flutter pub get 来安装依赖。

2. 配置 Google Maps API

要使用 google_maps_place_picker,你需要在 Google Cloud Platform 上启用 Google Maps JavaScript API 和 Places API。确保你已经生成了 API 密钥,并在 AndroidManifest.xmlInfo.plist 中进行了配置。

Android 配置

android/app/src/main/AndroidManifest.xml 中添加以下内容:

<manifest ...>
  <application ...>
    <meta-data
      android:name="com.google.android.geo.API_KEY"
      android:value="YOUR_API_KEY"/>
  </application>
</manifest>

iOS 配置

ios/Runner/Info.plist 中添加以下内容:

<key>io.flutter.embedded_views_preview</key>
<true/>
<key>GMSApiKey</key>
<string>YOUR_API_KEY</string>

3. 使用 PlacePicker

在你的 Flutter 应用中,你可以使用 PlacePicker widget 来启动地点选择器。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:google_maps_place_picker/google_maps_place_picker.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

class PlacePickerExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Place Picker Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 启动地点选择器
            PlacePicker(
              apiKey: "YOUR_API_KEY",
              onPlacePicked: (PickResult result) {
                // 处理选择的地点
                print("Place Name: ${result.name}");
                print("Place Address: ${result.formattedAddress}");
                print("Place Location: ${result.geometry.location}");

                // 关闭地点选择器并返回上一页
                Navigator.of(context).pop();
              },
              initialPosition: LatLng(37.4219999, -122.0840575), // 初始位置
              useCurrentLocation: true, // 是否使用当前位置
            ).show(context);
          },
          child: Text('Pick a Place'),
        ),
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: PlacePickerExample(),
));
回到顶部