Flutter地理位置搜索插件flutter_location_search的使用

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

Flutter地理位置搜索插件flutter_location_search的使用

概述

flutter_location_search 是一个Flutter插件,它提供了基于Open Street Map的位置搜索功能,并且可以保存最近搜索位置的历史记录。

功能

  • 通过地点进行位置搜索
  • 返回选定位置的数据
  • 可以在全屏模式或覆盖模式下显示
  • 易于使用和自定义

预览

预览图片1 预览图片2 预览图片3

设置

Android
  1. gradle.properties 文件中添加以下内容:

    android.useAndroidX=true
    android.enableJetifier=true
    
  2. android/app/build.gradle 文件中设置 compileSdkVersion

    android {
      compileSdkVersion 33
      ...
    }
    
  3. android/app/build.gradle 文件中设置 minSdkVersion

    android {
      minSdkVersion 23
      ...
    }
    
  4. 将所有 android. 依赖替换为其 AndroidX 对应项。

  5. AndroidManifest.xml 文件中添加权限:

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    
iOS
  1. Info.plist 文件中添加以下条目:

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>This app needs access to location when open.</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>This app needs access to location when in the background.</string>
    
  2. 如果需要后台更新,请在 XCode 中添加 Background Modes 能力并选择 Location Updates。

安装

pubspec.yaml 文件中添加以下内容:

dependencies:
  flutter_location_search: ^1.2.0

开始使用

导入包:

import 'package:flutter_location_search/flutter_location_search.dart';

调用 LocationSearch.show() 函数:

LocationData? locationData = await LocationSearch.show(
    context: context,
    mode: Mode.fullscreen // 可选参数:fullscreen 或 overlay
);

LocationSearch 的参数包括:

  • onError: 错误回调函数
  • language: 地址文本的语言,默认为 ‘en’
  • countryCodes: 限制搜索结果的国家列表
  • loadingWidget: 自定义加载小部件
  • searchBarBackgroundColor: 搜索栏背景颜色
  • searchBarTextColor: 搜索栏文本颜色
  • searchBarHintText: 搜索栏提示文本
  • searchBarHintColor: 搜索栏提示文本颜色
  • lightAdress: 如果为 true,显示和返回的地址将更轻量
  • iconColor: 搜索栏图标颜色
  • currentPositionButtonText: 当前位置按钮文本
  • mode: 显示模式(全屏或覆盖)
  • historyMaxLength: 历史记录的最大长度

使用示例

当在搜索栏中输入时,会显示位置建议。选择一个位置后,将返回一个 LocationData 对象,包含以下属性:

  • latitude
  • longitude
  • address (String 类型)
  • addressData (Map<String, dynamic> 类型,包含地址详细信息)

完整示例代码如下:

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

void main() => runApp(const MyApp());

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _locationText = 'Tap here to search a place';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Location Picker',
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: Builder(builder: (context) {
            return TextButton(
              child: Text(_locationText),
              onPressed: () async {
                // 调用 LocationSearch.show 方法
                LocationData? locationData = await LocationSearch.show(
                  context: context,
                  lightAddress: true, // 使用较轻量的地址显示
                  mode: Mode.overlay, // 使用覆盖模式
                );

                if (locationData == null) return;

                // 更新显示的地址文本
                _locationText = locationData.address;
                setState(() {});
              },
            );
          }),
        ),
      ),
    );
  }
}

依赖版本解决问题

如果遇到依赖版本冲突问题,可以在 pubspec.yaml 文件中添加以下内容:

dependency_overrides:
  intl: ^0.18.0

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用flutter_location_search插件的示例代码。这个插件允许你在Flutter应用中实现地理位置搜索功能。

首先,确保你已经在你的pubspec.yaml文件中添加了flutter_location_search依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_location_search: ^2.0.0  # 请检查最新版本号

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

接下来,你可以在你的Flutter应用中实现地理位置搜索功能。以下是一个简单的示例,展示如何使用flutter_location_search插件:

import 'package:flutter/material.dart';
import 'package:flutter_location_search/flutter_location_search.dart';
import 'package:geocoding/geocoding.dart' as geocoding;

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

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

class LocationSearchScreen extends StatefulWidget {
  @override
  _LocationSearchScreenState createState() => _LocationSearchScreenState();
}

class _LocationSearchScreenState extends State<LocationSearchScreen> {
  final TextEditingController _controller = TextEditingController();
  List<LocationResult> _locations = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Location Search'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: <Widget>[
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                hintText: 'Search for a location...',
                suffixIcon: IconButton(
                  icon: Icon(Icons.search),
                  onPressed: _onSearchPressed,
                ),
              ),
            ),
            SizedBox(height: 16.0),
            Expanded(
              child: _locations.isEmpty
                  ? Center(child: Text('No results found'))
                  : ListView.builder(
                      itemCount: _locations.length,
                      itemBuilder: (context, index) {
                        final location = _locations[index];
                        return ListTile(
                          title: Text(location.description ?? ''),
                          subtitle: Text('${location.geometry?.location?.lat}, ${location.geometry?.location?.lng}'),
                          onTap: () {
                            // Handle location tap, e.g., show details or navigate to the location
                            // Convert to address
                            final address = geocoding.latLngToAddress(
                              location.geometry?.location?.lat ?? 0.0,
                              location.geometry?.location?.lng ?? 0.0,
                            );
                            print('Address: $address');
                          },
                        );
                      }),
            ),
          ],
        ),
      ),
    );
  }

  void _onSearchPressed() {
    setState(() {
      _locations = [];
    });

    final query = _controller.text.trim();
    if (query.isEmpty) return;

    FlutterLocationSearch().searchForLocation(query)
        .then((locations) {
          setState(() {
            _locations = locations;
          });
        })
        .catchError((error) {
          print('Error searching for location: $error');
        });
  }
}

解释

  1. 依赖导入:首先,我们在pubspec.yaml文件中添加了flutter_location_search依赖。

  2. UI结构

    • 使用TextField来输入搜索查询。
    • 使用ListView.builder来显示搜索结果。
  3. 搜索功能

    • 当用户在TextField中输入查询并按下搜索按钮(或键盘上的搜索键)时,调用_onSearchPressed方法。
    • FlutterLocationSearch().searchForLocation(query)用于执行搜索并返回搜索结果。
    • 将搜索结果存储在_locations列表中,并在UI中显示。
  4. 地址转换(可选):

    • 使用geocoding库(需要额外安装)将经纬度转换为人类可读的地址。这只是一个示例,你可以根据需要处理搜索结果。

请确保你已经安装了geocoding库(如果需要地址转换功能):

dependencies:
  geocoding: ^2.0.0  # 请检查最新版本号

这个示例代码提供了一个基本的地理位置搜索功能,你可以根据需要进行扩展和自定义。

回到顶部