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 # 请检查最新版本号
这个示例代码提供了一个基本的地理位置搜索功能,你可以根据需要进行扩展和自定义。