Flutter地点选择插件google_maps_place_picker的使用
Flutter地点选择插件google_maps_place_picker的使用
预览
支持
如果该插件对您有用或节省了您的时间,请不要犹豫为我买杯咖啡!😉
更多咖啡,更多的未来有用项目。
获取开始
- 在https://cloud.google.com/maps-platform/获取API密钥。
- 启用Google Map SDK以支持每个平台。
- 您可以在此处找到有关如何开始使用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。详细的说明可以在这里找到。
简化版的步骤如下:
- 在
gradle.properties
文件中添加以下内容:
android.useAndroidX=true
android.enableJetifier=true
- 确保在
android/app/build.gradle
文件中的compileSdkVersion
设置为28:
android {
compileSdkVersion 28
...
}
- 将所有
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
更多关于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.xml
和 Info.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(),
));