Flutter地图与地点自动完成插件maps_places_autocomplete的使用
Flutter 地图与地点自动完成插件 maps_places_autocomplete
的使用
特性
- 列出地点搜索建议
- 点击获取地点详细信息映射
开始使用
在 example
文件夹内有一个完整的使用示例。
使用方法
查看 example
文件夹内的 main.dart
示例文件。
导入库
import 'package:maps_places_autocomplete/maps_places_autocomplete.dart';
import 'package:maps_places_autocomplete/model/place.dart';
编写回调函数
void onSuggestionClick(Place placeDetails) {
setState(() {
_streetNumber = placeDetails.streetNumber;
_street = placeDetails.street;
_city = placeDetails.city;
_state = placeDetails.state;
_zipCode = placeDetails.zipCode;
_country = placeDetails.country;
_vicinity = placeDetails.vicinity;
_lat = placeDetails.lat;
_lng = placeDetails.lng;
});
}
包含插件并配置语言和国家限制
语言和国家限制是可选的。插入你的 Google Places API 密钥。
MapsPlacesAutocomplete(
mapsApiKey: 'YOUR KEY HERE',
onSuggestionClick: onSuggestionClick,
componentCountry: 'br',
language: 'pt-BR'
),
额外信息
此包实现了 Google 地图地点 API 的官方文档,并且使用地址作为类型,并接收包含 address_component
和 geometry
字段的详细信息。
完整示例代码
以下是完整的示例代码:
import 'package:flutter/material.dart';
import 'package:maps_places_autocomplete/maps_places_autocomplete.dart';
import 'package:maps_places_autocomplete/model/place.dart';
import 'package:maps_places_autocomplete/model/suggestion.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// 这个小部件是你的应用的根
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String? _streetNumber;
String? _street;
String? _city;
String? _state;
String? _zipCode;
String? _vicinity;
String? _country;
double? _lat;
double? _lng;
// 编写一个函数来接收地点详情的回调
void onSuggestionClick(Place placeDetails) {
setState(() {
_streetNumber = placeDetails.streetNumber;
_street = placeDetails.street;
_city = placeDetails.city;
_state = placeDetails.state;
_zipCode = placeDetails.zipCode;
_country = placeDetails.country;
_vicinity = placeDetails.vicinity;
_lat = placeDetails.lat;
_lng = placeDetails.lng;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: SingleChildScrollView(
child: Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(color: Colors.blue, height:200),
// 导入插件并配置
SizedBox(
height: 40,
child: MapsPlacesAutocomplete(
mapsApiKey: 'YOUR KEY HERE',
onSuggestionClick: onSuggestionClick,
buildItem: (Suggestion suggestion, int index) {
return Container(
margin: const EdgeInsets.fromLTRB(2, 2, 2, 0),
padding: const EdgeInsets.all(8),
alignment: Alignment.centerLeft,
color: Colors.white,
child: Text(suggestion.description)
);
},
inputDecoration: const InputDecoration(
contentPadding: EdgeInsets.all(8),
border: OutlineInputBorder(
borderSide: BorderSide(color: Colors.white)),
hintText:
"请输入带编号的地址以提高搜索精度",
errorText: null),
clearButton: const Icon(Icons.close),
componentCountry: 'br',
language: 'pt-BR'
),
),
// 使用回调中的详细信息
Container(
padding: const EdgeInsets.all(8),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('编号: ${_streetNumber ?? '---'}'),
Text('地址: ${_street ?? '---'}'),
Text('地区: ${_vicinity ?? '---'}'),
Text('城市: ${_city ?? '---'}'),
Text('州/省: ${_state ?? '---'}'),
Text('国家: ${_country ?? '---'}'),
Text('邮政编码: ${_zipCode ?? '---'}'),
Text('纬度: ${_lat ?? '---'}'),
Text('经度: ${_lng ?? '---'}'),
],
),
),
Container(color: Colors.red, height:200),
Container(color: Colors.orange, height:200),
Container(color: Colors.blue, height:200),
],
),
),
),
));
}
}
更多关于Flutter地图与地点自动完成插件maps_places_autocomplete的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地图与地点自动完成插件maps_places_autocomplete的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter中使用maps_places_autocomplete
插件来实现地图和地点自动完成的示例代码。这个插件可以帮助你实现一个地点搜索框,当用户输入时自动显示相关的地点建议,并能够在地图上显示选中的地点。
首先,你需要在你的pubspec.yaml
文件中添加maps_places_autocomplete
和google_maps_flutter
依赖:
dependencies:
flutter:
sdk: flutter
maps_places_autocomplete: ^0.2.0 # 请检查最新版本号
google_maps_flutter: ^2.0.10 # 请检查最新版本号
然后运行flutter pub get
来安装这些依赖。
接下来,在你的Flutter项目中创建一个页面,例如MapScreen.dart
,并添加以下代码:
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:maps_places_autocomplete/maps_places_autocomplete.dart';
class MapScreen extends StatefulWidget {
@override
_MapScreenState createState() => _MapScreenState();
}
class _MapScreenState extends State<MapScreen> {
final GoogleMapsPlaces _places = GoogleMapsPlaces(apiKey: "YOUR_API_KEY");
LatLng _selectedPlaceCoords = LatLng(0, 0);
GoogleMapController? _mapController;
final Set<Marker> _markers = HashSet<Marker>();
final TextEditingController _placeController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Map with Place Autocomplete'),
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: <Widget>[
PlacesAutocompleteTextField(
apiKey: "YOUR_API_KEY",
onPlaceSelected: _handleSelectPlace,
textController: _placeController,
style: TextStyle(fontSize: 16),
),
SizedBox(height: 20),
Expanded(
child: GoogleMap(
mapType: MapType.normal,
initialCameraPosition: CameraPosition(
target: _selectedPlaceCoords,
zoom: 14.0,
),
markers: _markers.toSet(),
onMapCreated: (GoogleMapController controller) {
_mapController = controller;
},
),
),
],
),
),
);
}
void _handleSelectPlace(Place place) {
setState(() {
_selectedPlaceCoords = LatLng(place.geometry.location.lat, place.geometry.location.lng);
_markers.clear();
_markers.add(Marker(
markerId: MarkerId("place"),
position: _selectedPlaceCoords,
));
if (_mapController != null) {
_mapController!.animateCamera(CameraUpdate.newLatLngZoom(_selectedPlaceCoords, 14));
}
});
}
}
注意以下几点:
- 替换
YOUR_API_KEY
为你的Google Maps Platform API密钥。 - 这个示例代码创建了一个简单的Flutter应用,包含一个地点自动完成输入框和一个Google地图。
- 当用户选择一个地点时,地图会更新并显示所选地点的位置。
最后,在你的main.dart
文件中引入并使用这个MapScreen
:
import 'package:flutter/material.dart';
import 'MapScreen.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MapScreen(),
);
}
}
这样,你就可以运行你的Flutter应用,并看到一个带有地点自动完成功能的地图页面了。