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_componentgeometry 字段的详细信息。

完整示例代码

以下是完整的示例代码:

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

1 回复

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


当然,以下是一个关于如何在Flutter中使用maps_places_autocomplete插件来实现地图和地点自动完成的示例代码。这个插件可以帮助你实现一个地点搜索框,当用户输入时自动显示相关的地点建议,并能够在地图上显示选中的地点。

首先,你需要在你的pubspec.yaml文件中添加maps_places_autocompletegoogle_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));
      }
    });
  }
}

注意以下几点:

  1. 替换YOUR_API_KEY为你的Google Maps Platform API密钥。
  2. 这个示例代码创建了一个简单的Flutter应用,包含一个地点自动完成输入框和一个Google地图。
  3. 当用户选择一个地点时,地图会更新并显示所选地点的位置。

最后,在你的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应用,并看到一个带有地点自动完成功能的地图页面了。

回到顶部