Flutter地点搜索与选择插件google_places_api_flutter的使用
Flutter地点搜索与选择插件google_places_api_flutter的使用
google_places_api_flutter
是一个用于将 Google 地点 API 集成到 Flutter 应用程序中的插件,提供实时自动完成建议、地点详情等功能。
特性
- 自动完成地点搜索:用户输入时获取实时地点建议。
- 地点详情:获取特定地点的详细信息,包括地址、纬度和经度。
- 可自定义的界面:轻松自定义自动完成建议下拉框的样式。
- 支持纬度/经度检索:可以选择检索选定地点的纬度和经度。
示例
以下是一个展示 google_places_api_flutter
插件功能的示例:
开始使用
要开始使用 google_places_api_flutter
,你需要创建一个带有对 Places API 访问权限的 Google API 密钥。
1. 设置你的 Google API 密钥
- 访问 Google Cloud Console。
- 创建一个新项目或使用现有项目。
- 导航至
APIs & Services
>Library
。 - 搜索并启用
Places API
。 - 转到
APIs & Services
>Credentials
并创建一个新的 API 密钥。 - (可选)限制你的 API 密钥以增强安全性。
2. 安装插件
在 pubspec.yaml
文件中添加以下依赖项:
dependencies:
google_places_api_flutter: ^1.0.0
使用方法
以下是使用 google_places_api_flutter
的步骤。
1. 导入包
import 'package:google_places_api_flutter/google_places_api_flutter.dart';
2. 示例:带经纬度检索的自动完成
以下是如何使用 PlaceSearchField
显示自动完成搜索字段,允许用户选择地点并检索纬度/经度:
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:google_places_api_flutter/google_places_api_flutter.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('插件示例应用'),
),
body: Center(
child: PlaceSearchField(
apiKey: "YOUR_GOOGLE_API_KEY", // 替换为你的实际 API 密钥
isLatLongRequired: true, // 获取地点详情时同时检索纬度和经度
webCorsProxyUrl: "https://cors-anywhere.herokuapp.com", // 可选参数,用于处理 Web 应用的 CORS 问题
onPlaceSelected: (placeId, latLng) async {
log('Place ID: $placeId');
log('Latitude and Longitude: $latLng');
},
decorationBuilder: (context, child) {
return Material(
type: MaterialType.card,
elevation: 4,
color: Colors.white,
borderRadius: BorderRadius.circular(8),
child: child,
);
},
itemBuilder: (context, prediction) => ListTile(
leading: const Icon(Icons.location_on),
title: Text(
prediction.description,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
),
),
),
);
}
}
更多关于Flutter地点搜索与选择插件google_places_api_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地点搜索与选择插件google_places_api_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于Flutter地点搜索与选择插件google_places_api_flutter
的使用,下面是一个详细的代码案例,展示了如何集成和使用该插件进行地点搜索和选择。
首先,确保你已经在你的pubspec.yaml
文件中添加了google_places_api_flutter
依赖:
dependencies:
flutter:
sdk: flutter
google_places_api_flutter: ^x.y.z # 替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,配置你的Google Places API。你需要一个Google Cloud Platform项目和一个API密钥。确保你已经启用了Places API,并获取了API密钥。
配置API密钥
在你的android/app/src/main/AndroidManifest.xml
文件中,添加你的API密钥(请注意,这仅适用于调试模式,生产环境中应使用更安全的方式管理API密钥,如通过环境变量或Firebase配置):
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="YOUR_API_KEY_HERE"/>
示例代码
在你的Flutter项目中,创建一个新的Dart文件(例如place_search.dart
),并添加以下代码:
import 'package:flutter/material.dart';
import 'package:google_places_api_flutter/models/prediction.dart';
import 'package:google_places_api_flutter/models/place_detail.dart';
import 'package:google_places_api_flutter/google_places_api_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: PlaceSearchScreen(),
);
}
}
class PlaceSearchScreen extends StatefulWidget {
@override
_PlaceSearchScreenState createState() => _PlaceSearchScreenState();
}
class _PlaceSearchScreenState extends State<PlaceSearchScreen> {
final TextEditingController _searchController = TextEditingController();
List<Prediction> _predictions = [];
PlaceDetail? _selectedPlace;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Google Places API Flutter Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextField(
controller: _searchController,
decoration: InputDecoration(
prefixIcon: Icon(Icons.search),
labelText: 'Search for a place',
suffixIcon: IconButton(
icon: Icon(Icons.search),
onPressed: _onSearchPressed,
),
),
),
SizedBox(height: 16),
Expanded(
child: _predictions.isEmpty
? Center(child: Text('No predictions found'))
: ListView.builder(
itemCount: _predictions.length,
itemBuilder: (context, index) {
Prediction prediction = _predictions[index];
return ListTile(
title: Text(prediction.description ?? ''),
onTap: () async {
PlaceDetail? placeDetail = await GooglePlacesApiFlutter.getPlaceDetailsById(prediction.placeId ?? '');
setState(() {
_selectedPlace = placeDetail;
});
// 可以在这里处理选择的地方,例如导航到详情页面
},
);
},
),
),
if (_selectedPlace != null) {
SizedBox(height: 16),
Divider(),
SizedBox(height: 16),
Text('Selected Place:'),
Text(_selectedPlace?.name ?? ''),
Text(_selectedPlace?.formattedAddress ?? ''),
// 可以添加更多关于选中地点的信息展示
},
],
),
),
);
}
void _onSearchPressed() async {
String input = _searchController.text;
if (input.isNotEmpty) {
List<Prediction> predictions = await GooglePlacesApiFlutter.getAutocompletePredictions(input);
setState(() {
_predictions = predictions;
});
}
}
}
说明
-
搜索功能:用户在文本框中输入搜索词后,点击搜索图标或按下回车键,会调用
_onSearchPressed
方法,该方法使用GooglePlacesApiFlutter.getAutocompletePredictions
获取自动完成预测结果,并更新UI显示这些预测。 -
选择功能:用户点击某个预测项时,会调用
GooglePlacesApiFlutter.getPlaceDetailsById
获取该地点的详细信息,并更新UI显示这些信息。 -
UI设计:使用
TextField
进行搜索输入,使用ListView.builder
显示预测结果,使用Text
和Divider
展示选中地点的详细信息。
请确保你的Google Places API配置正确,并且你的API密钥具有访问Places API的权限。如果在Android模拟器或真机上测试时遇到权限问题,请检查你的AndroidManifest.xml文件和API密钥的有效性。