Flutter谷歌地图集成插件google_maps_pro的使用

Flutter谷歌地图集成插件google_maps_pro的使用

google_maps_pro

google_maps_pro 是一个用于在 Flutter 应用中集成谷歌地图的新插件。

获取开始

这个项目是一个用于 Flutter 的插件包的起点,这种插件包包含针对 Android 和/或 iOS 的平台特定实现代码。

要开始使用 Flutter,请查看我们的在线文档,其中提供了教程、示例、移动开发指南以及完整的 API 参考。


使用示例

以下是一个完整的示例,展示如何在 Flutter 中使用 google_maps_pro 插件来集成谷歌地图。

示例代码

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter_json_view/flutter_json_view.dart';
import 'package:google_maps_pro/google_maps_pro.dart';
import 'package:google_maps_pro/model/components_filter.dart';
import 'package:google_maps_pro/model/geocode_response.dart';

void main() {
  runApp(MaterialApp(home: MyApp()));
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  TextEditingController _query = TextEditingController();

  TextEditingController _latlong = TextEditingController();

  late GoogleMapsPro _googleMapsPro;

  ///您的谷歌地图 API 密钥
  String apiKey = 'GOOGLE API KEY';

  List<Results> _geocodeResponse = <Results>[];

  [@override](/user/override)
  void initState() {
    super.initState();

    _googleMapsPro = GoogleMapsPro(apiKey);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Google Maps Pro 示例'),
      ),
      body: SingleChildScrollView(
        child: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: [
              // 自动完成地址搜索
              AutoCompleteAddressSearch(
                apiKey: apiKey,
                geocodeResponse: (Results? geoResults) {
                  setState(() {
                    if (geoResults != null) _geocodeResponse.add(geoResults);
                  });
                },
                disableLogo: false,
              ),
              SizedBox(height: 16.0),
              // 输入邮政编码并获取地址
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  Flexible(
                    child: TextField(
                      controller: _query,
                      keyboardType: TextInputType.number,
                      decoration: InputDecoration(
                          hintText: '输入邮政编码',
                          border: OutlineInputBorder(
                              borderRadius: BorderRadius.circular(8.0))),
                    ),
                  ),
                  Flexible(
                    child: ElevatedButton(
                        onPressed: () async {
                          print(_query.text);
                          if (_query.text.length == 6) {
                            _geocodeResponse =
                                (await _googleMapsPro.getMapDataBy(
                                        componentsFilter: ComponentsFilter(
                                            postalCode: _query.text)))
                                    .results!;
                          }

                          setState(() {});
                        },
                        child: Text('获取地址')),
                  ),
                ],
              ),
              SizedBox(height: 16.0),
              // 输入经纬度并获取地址
              TextField(
                controller: _latlong,
                keyboardType: TextInputType.text,
                decoration: InputDecoration(
                    hintText: '搜索经纬度,例如:79.580167,20.634550',
                    border: OutlineInputBorder(
                        borderRadius: BorderRadius.circular(8.0))),
              ),
              ElevatedButton(
                  onPressed: () async {
                    print(_latlong.text.contains(','));
                    List<String> splittedLatLng = _latlong.text.split(',');
                    _geocodeResponse = (await _googleMapsPro.getMapDataBy(
                            lat: splittedLatLng.first,
                            lng: splittedLatLng.last))
                        .results!;

                    setState(() {});
                  },
                  child: Text('获取地址')),
              // 打开底部弹出框搜索地址
              ElevatedButton(
                  onPressed: () async {
                    showSearchBottomSheet(context, (result) {
                      if (result != null) _geocodeResponse.add(result);
                      setState(() {});
                    });
                  },
                  child: Text('在底部弹出框中搜索地址')),
              SizedBox(height: 16.0),
              // 搜索结果展示
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Text(
                  '搜索结果',
                  style: TextStyle(fontSize: 18.0),
                ),
              ),
              SingleChildScrollView(
                physics: ClampingScrollPhysics(),
                padding: const EdgeInsets.all(16.0),
                child: SingleChildScrollView(
                  physics: AlwaysScrollableScrollPhysics(),
                  scrollDirection: Axis.horizontal,
                  child: JsonView.string(json.encode(_geocodeResponse)),
                ),
              )
            ],
          ),
        ),
      ),
    );
  }

  // 显示底部弹出框
  Future<void> showSearchBottomSheet(
      BuildContext context, Function(Results?) result) async {
    await showModalBottomSheet<void>(
        context: context,
        isScrollControlled: true,
        isDismissible: false,
        shape: const RoundedRectangleBorder(
          borderRadius: BorderRadius.only(
            topLeft: Radius.circular(16.0),
            topRight: Radius.circular(16.0),
          ),
        ),
        builder: (context) {
          return StatefulBuilder(
              builder: (BuildContext context, StateSetter setState) {
            return Padding(
              padding: EdgeInsets.only(
                  left: 16.0,
                  top: 16.0,
                  right: 16.0,
                  bottom: MediaQuery.of(context).viewInsets.bottom + 16.0),
              child: AutoCompleteAddressSearch(
                apiKey: apiKey,
                geocodeResponse: (Results? results) {
                  setState(() {
                    Future.delayed(const Duration(milliseconds: 1000), () {
                      setState(() {
                        result(results);
                      });

                      Navigator.pop(context);
                    });
                  });
                },
                disableLogo: false,
              ),
            );
          });
        });
  }
}

更多关于Flutter谷歌地图集成插件google_maps_pro的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter谷歌地图集成插件google_maps_pro的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中集成谷歌地图可以使用google_maps_flutter插件,这是官方推荐的插件。不过,你提到的google_maps_pro插件可能是一个第三方插件或自定义插件。由于google_maps_pro并不是Flutter官方插件,我将为你介绍如何使用官方的google_maps_flutter插件来集成谷歌地图。

1. 添加依赖

首先,在pubspec.yaml文件中添加google_maps_flutter插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  google_maps_flutter: ^2.1.1

然后运行flutter pub get来获取依赖。

2. 配置API密钥

为了使用谷歌地图服务,你需要在Google Cloud Platform上启用Maps SDK for Android和Maps SDK for iOS,并获取API密钥。

Android配置

android/app/src/main/AndroidManifest.xml文件中添加以下代码:

<manifest ...
  <application ...
    <meta-data
      android:name="com.google.android.geo.API_KEY"
      android:value="YOUR_API_KEY"/>
  </application>
</manifest>

iOS配置

ios/Runner/AppDelegate.swift文件中添加以下代码:

import UIKit
import Flutter
import GoogleMaps

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GMSServices.provideAPIKey("YOUR_API_KEY")
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

3. 在Flutter中使用谷歌地图

在你的Flutter应用中,你可以使用GoogleMap widget来显示地图。

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

class MapScreen extends StatefulWidget {
  [@override](/user/override)
  _MapScreenState createState() => _MapScreenState();
}

class _MapScreenState extends State<MapScreen> {
  late GoogleMapController mapController;

  final LatLng _center = const LatLng(37.7749, -122.4194); // 旧金山坐标

  void _onMapCreated(GoogleMapController controller) {
    mapController = controller;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Maps'),
      ),
      body: GoogleMap(
        onMapCreated: _onMapCreated,
        initialCameraPosition: CameraPosition(
          target: _center,
          zoom: 11.0,
        ),
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: MapScreen(),
));
回到顶部