Flutter位置选择插件location_picker_flutter的使用

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

Flutter位置选择插件location_picker_flutter的使用

插件介绍

LocationPickerFlutter 是一个可定制的 Flutter 插件,允许用户通过 Google Maps 选择位置。它集成了 Google Maps、Places API 和 Geolocation 服务,提供无缝的位置选择体验。用户可以选择地图上的位置、使用当前位置或通过 Google Places Autocomplete 搜索位置。

特性

  • Google Maps 集成:支持交互式位置选择。
  • 搜索功能:使用 Google Places Autocomplete 进行搜索。
  • 地图类型显示/隐藏:可以显示或隐藏地图类型(卫星、地形等)。
  • 缩放和旋转手势支持:支持缩放和旋转手势。
  • 当前位置检测与导航:支持检测当前位置并进行导航。
  • 自定义位置详情展示:支持自定义位置详情展示。
  • 会话令牌支持:支持为 Google Places API 请求提供会话令牌。

安装

要在项目中使用此插件,请将其添加到 pubspec.yaml 文件中:

dependencies:
  location_picker_flutter: ^1.0.0

开始使用

  1. 添加您的 Google Maps API Key 到插件构造函数中。
  2. 自定义 InitialSettings 来指定初始位置和其他设置。
  3. 在需要位置选择的地方使用 LocationPickerFlutter 插件。

添加 Google Maps API Key

在 Android 和 iOS 上分别添加 API key。

Android
  1. 打开 AndroidManifest.xml 文件中的 <android/app/src/main/> 目录。
  2. <application> 标签内添加以下内容:
    &lt;meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="YOUR_GOOGLE_MAPS_API_KEY" /&gt;
    
    替换 YOUR_GOOGLE_MAPS_API_KEY 为您的实际 Google Maps API key。
iOS
  1. 打开 AppDelegate.swift 文件中的 ios/Runner/ 目录。
  2. 导入 Google Maps:
    import GoogleMaps
    
  3. @UIApplicationMain 中的 didFinishLaunchingWithOptions 方法内添加以下代码:
    GMSServices.provideAPIKey("YOUR_GOOGLE_MAPS_API_KEY")
    
    替换 YOUR_GOOGLE_MAPS_API_KEY 为您的实际 key。

示例用法

import 'package:flutter/material.dart';
import 'package:location_picker_flutter/location_picker_flutter.dart';
import 'package:location_picker_flutter/models/initial_settings.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Location Picker',
      home: Scaffold(
        appBar: AppBar(title: Text('Location Picker Example')),
        body: LocationPickerFlutter(
          googleMapsApiKey: 'YOUR_GOOGLE_MAPS_API_KEY',  // Your API key here
          intialLocation: InitialSettings(
            latitude: 37.7749,
            longitude: -1122.4194,
            zoomLevel: 10,
          ),
          showMapTypes: true,
          showZoomControls: true,
          canZoom: true,
          canRotate: true,
          searchHint: "Search for locations...",
          sessionToken: "",  // Optionally provide a session token
        ),
      ),
    );
  }
}

构造函数参数

  • googleMapsApiKey: 字符串 - 您的 Google Maps API key。
  • intialLocation: InitialSettings - 地图的初始设置,包括起始位置和缩放级别。
  • showMapTypes: 布尔 - 是否显示地图类型(默认为 false)。
  • showBuildings: 布尔 - 是否显示 3D 视图中的建筑物(默认为 true)。
  • showZoomControls: 布尔 - 是否显示缩放控件(默认为 false)。
  • canZoom: 布尔 - 是否启用缩放(默认为 true)。
  • canRotate: 布尔 - 是否启用旋转(默认为 true)。
  • searchHint: 字符串 - 搜索栏的提示文本(默认为 "Search for location, landmarks...")。
  • sessionToken: 字符串 - 可选的会话令牌用于 Google Places API 请求。

许可权限

确保您的应用已添加了必要的位置访问权限。

Android

AndroidManifest.xml 中添加以下内容:

&lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /&gt;
&lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt;
iOS

Info.plist 中添加这些内容:

&lt;key&gt;NSLocationWhenInUseUsageDescription&lt;/key&gt;
&lt;string&gt;Your custom message here&lt;/string&gt;
&lt;key&gt;NSLocationAlwaysUsageDescription&lt;/key&gt;
&lt;string&gt;Your custom message here&lt;/string&gt;

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

1 回复

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


当然,下面是一个关于如何使用 location_picker_flutter 插件的详细代码示例。这个插件允许用户在地图上选择一个位置,并返回该位置的经纬度信息。

首先,你需要在你的 pubspec.yaml 文件中添加 location_picker_flutter 依赖:

dependencies:
  flutter:
    sdk: flutter
  location_picker_flutter: ^latest_version  # 请替换为最新版本号

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

接下来,在你的 Dart 文件中,你可以按照以下方式使用 location_picker_flutter 插件:

import 'package:flutter/material.dart';
import 'package:location_picker_flutter/location_picker_flutter.dart';
import 'package:geolocator/geolocator.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Location Picker Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LocationPickerScreen(),
    );
  }
}

class LocationPickerScreen extends StatefulWidget {
  @override
  _LocationPickerScreenState createState() => _LocationPickerScreenState();
}

class _LocationPickerScreenState extends State<LocationPickerScreen> {
  LocationResult? _pickedLocation;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Location Picker Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _pickedLocation == null
                ? Text('No location picked yet.')
                : Text(
                    'Picked Location:\nLatitude: ${_pickedLocation!.latitude}\nLongitude: ${_pickedLocation!.longitude}',
                    style: TextStyle(fontSize: 18),
                  ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // Check permission before opening location picker
                bool serviceEnabled;
                LocationPermission permission;

                serviceEnabled = await Geolocator.isLocationServiceEnabled();
                if (!serviceEnabled) {
                  return Future.error('Location services are disabled.');
                }

                permission = await Geolocator.checkPermission();
                if (permission == LocationPermission.denied) {
                  permission = await Geolocator.requestPermission();
                  if (permission == LocationPermission.denied) {
                    return Future.error('Location permissions are denied');
                  }
                }

                if (permission == LocationPermission.deniedForever) {
                  return Future.error(
                      'Location permissions are permanently denied, we cannot request permissions.');
                }

                // Open location picker
                final result = await showLocationPicker(
                  context: context,
                  initialPosition:
                      LatLng(_pickedLocation?.latitude ?? 0, _pickedLocation?.longitude ?? 0) ??
                          LatLng(0, 0), // Use current location if available, otherwise default to 0,0
                );

                if (result != null && result.runtimeType == LocationResult) {
                  setState(() {
                    _pickedLocation = result;
                  });
                }
              },
              child: Text('Pick Location'),
            ),
          ],
        ),
      ),
    );
  }
}

代码说明:

  1. 依赖导入

    • 导入 flutter/material.dart 以使用 Flutter 的 Material 组件。
    • 导入 location_picker_flutter/location_picker_flutter.dart 以使用位置选择器。
    • 导入 geolocator/geolocator.dart 以处理位置权限和当前位置获取。
  2. 主应用

    • MyApp 类是应用的主入口,它设置了应用的主题和主屏幕。
  3. 位置选择屏幕

    • LocationPickerScreen 类是显示位置选择器的屏幕。
    • _pickedLocation 变量存储用户选择的位置。
  4. UI 构建

    • 使用 ScaffoldAppBar 构建应用的基本布局。
    • 使用 Column 布局显示当前选择的位置(如果有)和一个按钮来打开位置选择器。
  5. 位置选择器逻辑

    • 在按钮的 onPressed 回调中,首先检查位置服务是否启用。
    • 然后检查并请求位置权限。
    • 使用 showLocationPicker 函数显示位置选择器,并将用户选择的位置存储在 _pickedLocation 中。

确保在 Android 和 iOS 上正确配置位置权限。你可以在 AndroidManifest.xmlInfo.plist 中添加必要的权限声明。

这个示例展示了如何使用 location_picker_flutter 插件在 Flutter 应用中实现位置选择功能。你可以根据需要进一步定制和扩展这个示例。

回到顶部