Flutter地点自动补全插件autocomplete_google_places_widget的使用

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

Flutter地点自动补全插件autocomplete_google_places_widget的使用

autocomplete_google_places_widget是一个基于Flutter的默认Autocomplete小部件构建的插件,它利用Google Places API在用户输入时提供实时地点建议。本文将详细介绍如何使用这个插件,并提供一个完整的示例Demo。

特性

  • 🎨 高度可定制:提供了丰富的定制选项来满足您的特定需求。
  • 🕒 历史支持:包括历史记录支持,以便快速访问以前的搜索结果。
  • 💳 会话令牌:使用会话令牌将用户的查询分组在一个会话中,确保有效的计费。
  • ⏳ 反跳机制:实现了反跳机制以减少API调用的频率。

开始使用

首先,在您的Dart文件中导入该包:

import 'package:autocomplete_google_places_widget/autocomplete_google_places_widget.dart';

然后,在GPlacesAutoComplete小部件中添加您的Google API密钥:

GPlacesAutoComplete(
    googleAPIKey: _yourGoogleAPIKey,
    // 其他参数...
)

使用方法

GPlacesAutoComplete小部件有许多参数可以使用,以下是部分参数说明:

  • googleAPIKey: Google API密钥,用于Places API。
  • onOptionSelected: 用户选择一个选项时调用的回调函数。
  • textFormFieldBuilder: 输入搜索查询的文本字段构建器。如果不提供,默认使用文本字段。
  • menuBuilder: 选项视图构建器。
  • menuOptionBuilder: 菜单中单个选项视图的构建器。
  • debounceTime: 用户停止输入后等待的时间(毫秒),之后进行API请求。
  • countries: 限制搜索的国家列表(两个字符的地区代码)。
  • enableHistory: 是否启用历史记录保存功能。

完整示例Demo

以下是一个完整的示例,展示了如何在应用程序中集成和使用autocomplete_google_places_widget插件:

import 'dart:developer';
import 'package:autocomplete_google_places_widget/autocomplete_google_places_widget.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'GPlacesAutoComplete Widget Demo',
      home: MyHomePage(title: 'GPlacesAutoComplete Widget Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final String _yourGoogleAPIKey = 'YOUR_GOOGLE_API_KEY'; // 替换为您的Google API Key
  final TextEditingController _textEditingController = TextEditingController();
  final FocusNode _focusNode = FocusNode();
  bool isLoading = false;

  String _selectedPlace = '';

  [@override](/user/override)
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
      child: Scaffold(
        appBar: AppBar(
          title: Text(widget.title, style: const TextStyle(fontSize: 16)),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('Selected Place: $_selectedPlace'),
              const SizedBox(height: 16),
              GPlacesAutoComplete(
                googleAPIKey: _yourGoogleAPIKey,
                textEditingController: _textEditingController,
                focusNode: _focusNode,
                textFormFieldBuilder: (BuildContext context,
                    TextEditingController controller,
                    FocusNode focusNode,
                    VoidCallback onFieldSubmitted) {
                  return TextFormField(
                    controller: controller,
                    focusNode: focusNode,
                    onFieldSubmitted: (_) {
                      onFieldSubmitted();
                    },
                    decoration: InputDecoration(
                      prefixIcon: isLoading
                          ? Transform.scale(scale: 0.35, child: const CircularProgressIndicator())
                          : const Icon(Icons.search),
                      hintText: 'Search places...',
                      border: const OutlineInputBorder(),
                    ),
                  );
                },
                loadingCallback: (bool loading) {
                  setState(() {
                    isLoading = loading;
                  });
                },
                countries: const ['FR'],
                onOptionSelected: (option) {
                  log('onOptionSelected: ${option.description}');
                  setState(() {
                    _selectedPlace = option.description ?? '';
                  });
                },
                enableHistory: true,
                liteModeHistory: true,
              ),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton.small(
          onPressed: () {
            _textEditingController.clear();
            setState(() {
              _selectedPlace = '';
            });
          },
          tooltip: 'Clear',
          child: const Icon(Icons.delete),
        ),
      ),
    );
  }
}

更多关于Flutter地点自动补全插件autocomplete_google_places_widget的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地点自动补全插件autocomplete_google_places_widget的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用autocomplete_google_places_widget插件来实现地点自动补全功能的代码案例。这个插件允许你利用Google Places API来提供一个地点自动补全的用户界面。

首先,你需要在你的pubspec.yaml文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  autocomplete_google_places_widget: ^^最新版本号(请替换为实际版本号)

然后运行flutter pub get来安装依赖。

接下来,你需要在Google Cloud Platform上启用Places API并获取一个API密钥。确保你的API密钥有对Places API的访问权限。

以下是一个完整的Flutter应用示例,展示了如何使用autocomplete_google_places_widget

import 'package:flutter/material.dart';
import 'package:autocomplete_google_places_widget/autocomplete_google_places_widget.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Google Places Autocomplete Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final String apiKey = "YOUR_GOOGLE_PLACES_API_KEY"; // 替换为你的API密钥
  String? selectedPlace;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Places Autocomplete Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              decoration: InputDecoration(
                labelText: 'Search for a place',
                border: OutlineInputBorder(),
              ),
              controller: _buildTextController(),
              onEditingComplete: () async {
                final places = await PlacesAutocomplete.show(
                  context: context,
                  apiKey: apiKey,
                  mode: Mode.overlay, // or Mode.fullscreen
                );

                if (places?.first != null) {
                  setState(() {
                    selectedPlace = places?.first.description ?? '';
                  });
                }
              },
            ),
            SizedBox(height: 16),
            if (selectedPlace != null)
              Text(
                'Selected Place: $selectedPlace',
                style: TextStyle(fontSize: 18),
              ),
          ],
        ),
      ),
    );
  }

  TextEditingController _buildTextController() {
    final TextEditingController controller = TextEditingController();
    controller.addListener(() {
      // 可以在这里添加额外的文本监听逻辑,比如清除选中地点等
    });
    return controller;
  }
}

在这个示例中:

  1. apiKey变量存储了你的Google Places API密钥。
  2. TextField用于用户输入搜索查询。
  3. 当用户完成编辑(即按下完成键或点击屏幕其他地方)时,onEditingComplete回调函数会触发。
  4. PlacesAutocomplete.show方法会显示一个包含自动补全建议的对话框(或全屏视图,取决于mode参数)。
  5. 用户选择一个地点后,selectedPlace状态会被更新,并显示在屏幕上。

确保你替换了YOUR_GOOGLE_PLACES_API_KEY为你的实际API密钥,并且你的API密钥有对Places API的访问权限。

这个示例展示了基本的用法,你可以根据需要进一步自定义和扩展功能。

回到顶部