Flutter地理位置搜索插件flutter_location_search的使用
Flutter地理位置搜索插件flutter_location_search的使用
概述
flutter_location_search 是一个Flutter插件,它提供了基于Open Street Map的位置搜索功能,并且可以保存最近搜索位置的历史记录。
功能
- 通过地点进行位置搜索
 - 返回选定位置的数据
 - 可以在全屏模式或覆盖模式下显示
 - 易于使用和自定义
 
预览

设置
Android
- 
在
gradle.properties文件中添加以下内容:android.useAndroidX=true android.enableJetifier=true - 
在
android/app/build.gradle文件中设置compileSdkVersion:android { compileSdkVersion 33 ... } - 
在
android/app/build.gradle文件中设置minSdkVersion:android { minSdkVersion 23 ... } - 
将所有
android.依赖替换为其 AndroidX 对应项。 - 
在
AndroidManifest.xml文件中添加权限:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
iOS
- 
在
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> - 
如果需要后台更新,请在 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
更多关于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');
        });
  }
}
解释
- 
依赖导入:首先,我们在
pubspec.yaml文件中添加了flutter_location_search依赖。 - 
UI结构:
- 使用
TextField来输入搜索查询。 - 使用
ListView.builder来显示搜索结果。 
 - 使用
 - 
搜索功能:
- 当用户在
TextField中输入查询并按下搜索按钮(或键盘上的搜索键)时,调用_onSearchPressed方法。 FlutterLocationSearch().searchForLocation(query)用于执行搜索并返回搜索结果。- 将搜索结果存储在
_locations列表中,并在UI中显示。 
 - 当用户在
 - 
地址转换(可选):
- 使用
geocoding库(需要额外安装)将经纬度转换为人类可读的地址。这只是一个示例,你可以根据需要处理搜索结果。 
 - 使用
 
请确保你已经安装了geocoding库(如果需要地址转换功能):
dependencies:
  geocoding: ^2.0.0  # 请检查最新版本号
这个示例代码提供了一个基本的地理位置搜索功能,你可以根据需要进行扩展和自定义。
        
      
            
            
            
