Flutter地图自动完成搜索插件map_autocomplete_field的使用
Flutter 地图自动完成搜索插件 map_autocomplete_field
的使用
1. 插件简介
map_autocomplete_field
是一个用于 Flutter 应用的地图自动完成搜索插件。它通过 Google Places API 提供搜索建议,并将这些建议显示在一个可自定义的 TextField
中。该插件结合了 Dropdown
和 TextField
的功能,能够在用户失去焦点时自动收起建议列表,提供更好的用户体验。
2. 安装插件
要使用 map_autocomplete_field
,首先需要在 pubspec.yaml
文件中添加依赖:
dependencies:
map_autocomplete_field: ^0.0.1
3. 简单实现
以下是一个简单的示例,展示了如何在 Flutter 应用中使用 MapAutoCompleteField
:
import 'package:flutter/material.dart';
import 'package:map_autocomplete_field/map_autocomplete_field.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('地图自动完成搜索'),
),
body: Padding(
padding: const EdgeInsets.all(25),
child: MapAutoCompleteField(
googleMapApiKey: 'your_map_api_key', // 替换为你的 Google Maps API Key
controller: TextEditingController(),
itemBuilder: (BuildContext context, suggestion) {
return ListTile(
title: Text(suggestion.description),
);
},
onSuggestionSelected: (suggestion) {
// 当用户选择一个建议时,更新文本框的内容
addressCtrl.text = suggestion.description;
},
),
),
),
);
}
}
4. 带有更多自定义的实现
如果你想要更多的自定义选项,可以使用 inputDecoration
参数来设置 TextField
的样式。以下是一个带有更多自定义的示例:
import 'package:flutter/material.dart';
import 'package:map_autocomplete_field/map_autocomplete_field.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('地图自动完成搜索(带自定义)'),
),
body: Padding(
padding: const EdgeInsets.all(25),
child: MapAutoCompleteField(
googleMapApiKey: 'your_map_api_key', // 替换为你的 Google Maps API Key
controller: TextEditingController(),
itemBuilder: (BuildContext context, suggestion) {
return ListTile(
leading: Icon(Icons.add), // 添加图标
title: Text(suggestion.description),
);
},
onSuggestionSelected: (suggestion) {
// 当用户选择一个建议时,更新文本框的内容
addressCtrl.text = suggestion.description;
},
inputDecoration: const InputDecoration(
icon: Icon(Icons.add), // 输入框左侧图标
prefixIcon: Icon(Icons.remove), // 输入框前缀图标
suffixIcon: Icon(Icons.access_time_sharp), // 输入框后缀图标
fillColor: Colors.green, // 背景颜色
hintText: '请输入地址', // 提示文本
hintStyle: TextStyle(
color: Colors.grey,
fontSize: 16.0,
fontWeight: FontWeight.w400,
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 2,
color: Colors.green,
),
),
contentPadding: EdgeInsets.symmetric(
horizontal: 10,
vertical: 10,
),
border: OutlineInputBorder(
borderSide: BorderSide(
width: 2,
color: Colors.green,
),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 2,
color: Colors.green,
),
),
),
),
),
),
);
}
}
更多关于Flutter地图自动完成搜索插件map_autocomplete_field的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地图自动完成搜索插件map_autocomplete_field的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter中使用map_autocomplete_field
插件来实现地图自动完成搜索功能的示例代码。这个插件允许用户在地图上输入地点名称,并自动完成搜索,同时展示搜索结果。
首先,你需要在pubspec.yaml
文件中添加map_autocomplete_field
依赖:
dependencies:
flutter:
sdk: flutter
map_autocomplete_field: ^最新版本号 # 请替换为实际的最新版本号
然后,运行flutter pub get
来安装依赖。
接下来是主要的Dart代码部分。我们将创建一个简单的Flutter应用,其中包括一个自动完成搜索字段,用于搜索和选择地点。
import 'package:flutter/material.dart';
import 'package:map_autocomplete_field/map_autocomplete_field.dart';
import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Map Autocomplete Field Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _controller = TextEditingController();
LatLng? _selectedLocation;
List<Prediction>? _predictions;
GoogleMapController? _mapController;
final _key = GlobalKey<MapAutocompleteFieldState>();
@override
void dispose() {
_controller.dispose();
super.dispose();
}
void _onPlaceSelected(Prediction prediction) async {
final addresses = await Geocoder.local().fromPlacemark(Placemark.fromMap({
'name': prediction.description ?? '',
'locality': prediction.terms?.firstOrNullObject(where: { term -> term.type == "locality" })?.value,
'postalCode': prediction.terms?.firstOrNullObject(where: { term -> term.type == "postal_code" })?.value,
'route': prediction.terms?.firstOrNullObject(where: { term -> term.type == "route" })?.value,
'country': prediction.terms?.firstOrNullObject(where: { term -> term.type == "country" })?.value,
'administrativeArea': prediction.terms?.firstOrNullObject(where: { term -> term.type == "administrative_area_level_1" })?.value,
}));
if (addresses.isNotEmpty) {
final location = addresses.first.location;
setState(() {
_selectedLocation = LatLng(location.latitude, location.longitude);
});
// Move the camera to the selected location
_mapController?.animateCamera(CameraUpdate.newLatLngZoom(LatLng(location.latitude, location.longitude), 15));
}
}
void _onPredictionReceived(List<Prediction> predictions) {
setState(() {
_predictions = predictions;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Map Autocomplete Field Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
MapAutocompleteField(
apiKey: 'YOUR_GOOGLE_MAPS_API_KEY', // 请替换为你的Google Maps API密钥
controller: _controller,
key: _key,
onPredictionReceived: _onPredictionReceived,
onPlaceSelected: _onPlaceSelected,
style: TextStyle(fontSize: 18),
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: 'Search Place',
suffixIcon: IconButton(
icon: Icon(Icons.clear),
onPressed: () {
_controller.clear();
_key.currentState?.clearSuggestions();
},
),
),
),
SizedBox(height: 20),
if (_selectedLocation != null)
GoogleMap(
mapType: MapType.normal,
initialCameraPosition: CameraPosition(
target: _selectedLocation!,
zoom: 15,
),
onMapCreated: (GoogleMapController controller) {
_mapController = controller;
},
markers: Set.from([
Marker(
markerId: MarkerId('selectedLocation'),
position: _selectedLocation!,
),
]),
),
],
),
),
);
}
}
注意事项
- Google Maps API Key:确保你已经获取了Google Maps API密钥,并将其替换为
YOUR_GOOGLE_MAPS_API_KEY
。 - 依赖库:这个示例使用了
geocoding
和geolocator
库来处理地理编码和定位,以及google_maps_flutter
来显示地图。你可能需要在pubspec.yaml
中添加这些依赖项。 - 权限:在Android和iOS上,你需要配置必要的权限来使用地理位置和访问互联网。
这是一个基本的实现,你可以根据需要进行进一步的自定义和扩展。