Flutter地点选择器插件google_place_picker的使用

Flutter 地点选择器插件 google_place_picker 的使用

Google Place Picker

一个用于 Flutter 应用的 Google 地图地点选择器。

简介

一个简化实现从 Google 地图选择地点并在应用中使用的 Flutter 包。

  • 简单实现
  • 节省开发时间
  • 功能强大
  • 快速部署

关注我

GitHub followers GitHub Repo stars GitHub forks Pub Version

特性

  • 在 Google 地图上选择地点
  • 搜索特定位置或地址
  • 使用 GPS 和当前位置
  • 完全可自定义
  • 处理网络连接问题
  • 处理权限问题

示例预览

演示

开始使用

获取 API Key

Google Cloud Console 获取 API Key。

启用 Google 地图 SDK

  • 访问 Google 开发者控制台
  • 选择要启用 Google 地图的项目
  • 选择导航菜单并选择 “Google Maps”
  • 选择 “APIs” 下的 “附加 API” 部分
  • 为 Android 启用 “Maps SDK for Android”
  • 为 iOS 启用 “Maps SDK for iOS”
  • 确保启用的 API 在 “已启用的 API” 部分中

更多详情,请参阅 Google Maps 平台入门指南

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 Key:
<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 迁移指南 中找到)。

iOS 设置

要设置,请在应用程序代理 ios/Runner/AppDelegate.m 中指定 API Key:

#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 Key:

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>

此外,您需要在 XCode 项目中添加 <code>Background Modes</code> 功能,并选择 <code>Location Updates</code>。在项目的 <code>Info.plist</code> 文件中添加以下键值对以启用嵌入式视图预览:

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

使用方法

基本用法

您可以使用 GooglePlacePicker 通过导航到新页面或将其作为任何小部件的子组件。当用户在地图上选择一个地点时,它会返回一个包含 CompleteAddress 类型信息的结果到 getAddress 方法。

import 'package:flutter/material.dart';
import 'package:google_place_picker/google_place_picker.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 Place Picker Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Google Place Picker 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 = '';
  String city = '';
  String latitude = '';
  String longitude = '';

  [@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: <Widget>[
            Text(
              'Address: $address',
            ),
            Text(
              'City: $city',
            ),
            Text(
              'Latitude: $latitude',
            ),
            Text(
              'Longitude: $longitude',
            ),
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => GooglePlacePicker(
                      apiKey: 'YOUR_API_KEY',
                      getAddress: (completeAddress) {
                        setState(() {
                          address = completeAddress.completeAddress.toString();
                          city = completeAddress.city.toString();
                          latitude = completeAddress.position!.latitude.toString();
                          longitude = completeAddress.position!.longitude.toString();
                        });
                      },
                    ),
                  ),
                );
              },
              child: const Text('Pick a Place on Google Maps'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


google_place_picker 是一个用于 Flutter 的插件,允许用户从 Google Places API 中选择地点。这个插件提供了一个简单的界面,用户可以通过搜索选择地点,并返回所选地点的详细信息。

以下是使用 google_place_picker 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  google_place_picker: ^1.0.0  # 请检查最新版本

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

2. 配置 API 密钥

要使用 Google Places API,你需要在 Google Cloud Console 中启用 Places API 并获取 API 密钥。

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/Runner/Info.plist 文件中添加以下内容:

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

3. 使用插件

在你的 Flutter 代码中,你可以使用 GooglePlacePicker 来选择地点。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Place Picker Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 启动地点选择器
            PlaceResult result = await GooglePlacePicker.showPlacePicker(
              context,
              apiKey: 'YOUR_API_KEY',
            );

            if (result != null) {
              // 处理选择的地点
              print('Selected place: ${result.name}');
              print('Address: ${result.formattedAddress}');
              print('Latitude: ${result.geometry.location.lat}');
              print('Longitude: ${result.geometry.location.lng}');
            }
          },
          child: Text('Pick a Place'),
        ),
      ),
    );
  }
}

4. 处理返回结果

GooglePlacePicker.showPlacePicker 方法返回一个 PlaceResult 对象,其中包含所选地点的详细信息,如名称、地址、经纬度等。

5. 其他配置

你可以通过 GooglePlacePicker.showPlacePicker 方法的参数来配置地点选择器的行为,例如设置初始位置、限制搜索范围等。

PlaceResult result = await GooglePlacePicker.showPlacePicker(
  context,
  apiKey: 'YOUR_API_KEY',
  initialPosition: LatLng(37.4219999, -122.0840575), // 初始位置
  searchRadius: 5000, // 搜索半径(米)
);

6. 处理权限

确保你已经处理了位置权限,以便用户可以选择地点。你可以使用 location 插件来请求位置权限。

dependencies:
  location: ^4.4.0  # 请检查最新版本
import 'package:location/location.dart';

void requestLocationPermission() async {
  Location location = Location();

  bool _serviceEnabled;
  PermissionStatus _permissionGranted;

  _serviceEnabled = await location.serviceEnabled();
  if (!_serviceEnabled) {
    _serviceEnabled = await location.requestService();
    if (!_serviceEnabled) {
      return;
    }
  }

  _permissionGranted = await location.hasPermission();
  if (_permissionGranted == PermissionStatus.denied) {
    _permissionGranted = await location.requestPermission();
    if (_permissionGranted != PermissionStatus.granted) {
      return;
    }
  }
}
回到顶部