Flutter地点搜索与选择插件google_places_api_flutter的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter地点搜索与选择插件google_places_api_flutter的使用

google_places_api_flutter 是一个用于将 Google 地点 API 集成到 Flutter 应用程序中的插件,提供实时自动完成建议、地点详情等功能。

特性

  • 自动完成地点搜索:用户输入时获取实时地点建议。
  • 地点详情:获取特定地点的详细信息,包括地址、纬度和经度。
  • 可自定义的界面:轻松自定义自动完成建议下拉框的样式。
  • 支持纬度/经度检索:可以选择检索选定地点的纬度和经度。

示例

以下是一个展示 google_places_api_flutter 插件功能的示例:

Google Places API Flutter Demo

开始使用

要开始使用 google_places_api_flutter,你需要创建一个带有对 Places API 访问权限的 Google API 密钥。

1. 设置你的 Google API 密钥

  1. 访问 Google Cloud Console
  2. 创建一个新项目或使用现有项目。
  3. 导航至 APIs & Services > Library
  4. 搜索并启用 Places API
  5. 转到 APIs & Services > Credentials 并创建一个新的 API 密钥。
  6. (可选)限制你的 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

1 回复

更多关于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;
      });
    }
  }
}

说明

  1. 搜索功能:用户在文本框中输入搜索词后,点击搜索图标或按下回车键,会调用_onSearchPressed方法,该方法使用GooglePlacesApiFlutter.getAutocompletePredictions获取自动完成预测结果,并更新UI显示这些预测。

  2. 选择功能:用户点击某个预测项时,会调用GooglePlacesApiFlutter.getPlaceDetailsById获取该地点的详细信息,并更新UI显示这些信息。

  3. UI设计:使用TextField进行搜索输入,使用ListView.builder显示预测结果,使用TextDivider展示选中地点的详细信息。

请确保你的Google Places API配置正确,并且你的API密钥具有访问Places API的权限。如果在Android模拟器或真机上测试时遇到权限问题,请检查你的AndroidManifest.xml文件和API密钥的有效性。

回到顶部