Flutter地图展示插件google_maps_widget的使用
Flutter 地图展示插件 google_maps_widget 的使用
概述
GoogleMapsWidget
是一个用于 Flutter 开发者的插件,旨在帮助开发者轻松地在他们的应用中集成谷歌地图。它可以用于绘制从起点到终点的多段线(路线),并且可以处理司机的实时位置(如果有)。
功能
- 路线创建:通过提供纬度和经度来绘制起点和终点之间的多段线(路线)。
- 自定义路线外观:自定义路线的颜色和宽度。
- 实时位置跟踪:为司机提供实时位置跟踪功能,并自动更新地图上的标记。
- 标记自定义:完全可定制的标记。
- 用户交互处理:处理所有标记和信息窗口的
onTap
回调,以方便用户交互。 - 支持完整的谷歌地图参数:支持传递几乎所有的谷歌地图参数给 GoogleMap 小部件作为插件的参数。
开始使用
步骤 1:获取 API 密钥
访问 Google Cloud Maps Platform 并获取 API 密钥。
步骤 2:启用谷歌地图 SDK 和方向 API
- 转到 Google 开发者控制台,选择你的项目,并从导航菜单中打开谷歌地图部分。在 API 下,启用 Android 地图 SDK、iOS 地图 SDK 和 Web 地图 JavaScript API(在“附加 API”部分)。
- 为了启用方向 API,在“附加 API”部分选择“方向 API”,然后选择“启用”。
确保你启用的 API 在“已启用的 API”部分中。
步骤 3:参考文档
有关详细信息,请参阅 Google 地图平台入门指南。
平台特定设置
Android
注意:请参考谷歌地图的平台特定设置 此处。
在应用清单文件 android/app/src/main/AndroidManifest.xml
中指定你的 API 密钥:
<manifest ...
<application ...
<meta-data android:name="com.google.android.geo.API_KEY"
android:value="YOUR KEY HERE"/>
iOS
注意:请参考谷歌地图的平台特定设置 此处。
在应用委托文件 ios/Runner/AppDelegate.m
中指定你的 API 密钥:
#import "AppDelegate.h"
#include "GeneratedPluginRegistrant.h"
#import "GoogleMaps/GoogleMaps.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GMSServices provideAPIKey:@"YOUR KEY HERE"];
[GeneratedPluginRegistrant registerWithRegistry:self];
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end
或者在 Swift 代码中,指定你的 API 密钥在应用委托文件 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 KEY HERE")
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
Web
注意:请参考谷歌地图的平台特定设置 此处。
修改 web/index.html
文件
获取 Google 地图 JavaScript API 的 API 密钥。开始 这里。
修改 web/index.html
文件的 <head>
部分以加载 Google 地图 JavaScript API,如下所示:
<head>
<!-- 其他内容 -->
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY_HERE"></script>
</head>
使用
- 在
pubspec.yaml
文件中添加google_maps_widget
依赖。
dependencies:
flutter:
sdk: flutter
google_maps_widget:
- 现在可以在你的小部件树中添加
GoogleMapsWidget
小部件,并传递所有必需的参数以开始使用。此小部件将在提供的源和目的地经纬度之间创建一条路径。
import 'package:google_maps_widget/google_maps_widget.dart';
GoogleMapsWidget(
apiKey: "YOUR KEY HERE",
sourceLatLng: LatLng(40.484000837597925, -3.369978368282318),
destinationLatLng: LatLng(40.48017307700204, -3.3618026599287987),
),
- 可以创建一个控制器并与谷歌地图控制器进行交互,或更新源和目的地的经纬度。
// 可以创建一个控制器,并调用方法来更新源位置、
// 目的地位置,与谷歌地图控制器进行交互以程序化地显示/隐藏标记等。
final mapsWidgetController = GlobalKey<GoogleMapsWidgetState>();
// 将此控制器传递给 "key" 参数,然后可以像这样更新源或目的地,这也将重建路径。
mapsWidgetController.currentState!.setSourceLatLng(
LatLng(
40.484000837597925 * (Random().nextDouble()),
-3.369978368282318,
),
);
// 或者,可以直接与谷歌地图控制器进行交互以专注于标记等...
final googleMapsCon = await mapsWidgetController.currentState!.getGoogleMapsController();
googleMapsCon.showMarkerInfoWindow(MarkerIconInfo.sourceMarkerId);
示例代码
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:google_maps_widget/google_maps_widget.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// 可以创建一个控制器,并调用方法来更新源位置、
// 目的地位置,与谷歌地图控制器进行交互以程序化地显示/隐藏标记等。
final mapsWidgetController = GlobalKey<GoogleMapsWidgetState>();
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: SafeArea(
child: Scaffold(
body: Column(
children: [
Expanded(
child: GoogleMapsWidget(
apiKey: "YOUR GOOGLE MAPS API KEY HERE",
key: mapsWidgetController,
sourceLatLng: LatLng(
40.484000837597925,
-3.369978368282318,
),
destinationLatLng: LatLng(
40.48017307700204,
-3.3618026599287987,
),
///////////////////////////////////////////////////////
////////////// OPTIONAL PARAMETERS //////////////
///////////////////////////////////////////////////////
routeWidth: 2,
sourceMarkerIconInfo: MarkerIconInfo(
infoWindowTitle: "This is source name",
onTapInfoWindow: (_) {
debugPrint("Tapped on source info window");
},
assetPath: "assets/images/house-marker-icon.png",
assetMarkerSize: Size.square(50),
),
destinationMarkerIconInfo: MarkerIconInfo(
assetPath: "assets/images/restaurant-marker-icon.png",
assetMarkerSize: Size.square(50),
),
driverMarkerIconInfo: MarkerIconInfo(
infoWindowTitle: "Alex",
assetPath: "assets/images/driver-marker-icon.png",
onTapMarker: (currentLocation) {
debugPrint("Driver is currently at $currentLocation");
},
assetMarkerSize: Size.square(50),
rotation: 90,
),
onPolylineUpdate: (p) {
debugPrint("Polyline updated: ${p.points}");
},
updatePolylinesOnDriverLocUpdate: true,
// 模拟流
driverCoordinatesStream: Stream.periodic(
Duration(milliseconds: 500),
(i) => LatLng(
40.47747872288886 + i / 10000,
-3.368043154478073 - i / 10000,
),
),
totalTimeCallback: (time) => debugPrint(time),
totalDistanceCallback: (distance) => debugPrint(distance),
),
),
// 展示如何与控制器进行交互
Padding(
padding: const EdgeInsets.all(10),
child: Row(
children: [
Expanded(
child: ElevatedButton(
onPressed: () {
mapsWidgetController.currentState!.setSourceLatLng(
LatLng(
40.484000837597925 * (Random().nextDouble()),
-3.369978368282318,
),
);
},
child: Text('Update source'),
),
),
const SizedBox(width: 10),
Expanded(
child: ElevatedButton(
onPressed: () async {
final googleMapsCon = await mapsWidgetController
.currentState!
.getGoogleMapsController();
googleMapsCon.showMarkerInfoWindow(
MarkerIconInfo.sourceMarkerId,
);
},
child: Text('Show source info'),
),
),
],
),
),
],
),
),
),
);
}
}
更多关于Flutter地图展示插件google_maps_widget的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地图展示插件google_maps_widget的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个使用 google_maps_widget
(请注意,这个库可能不是官方的 Flutter Google Maps 插件,通常官方插件是 google_maps_flutter
。但为了符合你的要求,我将基于假设这个库具有类似的功能)来展示地图的简单示例代码。如果实际使用的库有所不同,请参考其官方文档进行调整。
首先,确保你的 Flutter 项目已经配置好 Google Maps API 密钥。这通常涉及以下几个步骤:
- 在 Google Cloud Platform 上创建一个项目。
- 启用 Google Maps JavaScript API 和 Google Maps Places API(对于需要地点搜索等功能的情况)。
- 创建一个 API 密钥,并将其限制到特定的 IP 地址或应用。
- 在
AndroidManifest.xml
和Info.plist
文件中添加必要的权限和 API 密钥配置。
假设 google_maps_widget
的使用方式与 google_maps_flutter
类似,下面是一个基本的 Flutter 应用代码示例,展示如何在应用中集成地图:
1. 添加依赖
在你的 pubspec.yaml
文件中添加 google_maps_widget
(或实际使用的插件)依赖:
dependencies:
flutter:
sdk: flutter
google_maps_widget: ^x.y.z # 替换为实际版本号
2. 导入插件并配置地图
在你的 Dart 文件中(例如 main.dart
),导入插件并配置地图:
import 'package:flutter/material.dart';
import 'package:google_maps_widget/google_maps_widget.dart'; // 假设库名为 google_maps_widget
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Google Maps Demo'),
),
body: GoogleMapScreen(),
),
);
}
}
class GoogleMapScreen extends StatefulWidget {
@override
_GoogleMapScreenState createState() => _GoogleMapScreenState();
}
class _GoogleMapScreenState extends State<GoogleMapScreen> {
GoogleMapController? _controller;
static final LatLng _center = LatLng(37.7749, -122.4194); // 旧金山的坐标
@override
Widget build(BuildContext context) {
return GoogleMap(
mapType: MapType.normal,
initialCameraPosition: CameraPosition(
target: _center,
zoom: 14.0,
),
onMapCreated: (GoogleMapController controller) {
_controller = controller;
},
markers: Set.from([
Marker(
markerId: MarkerId("center"),
position: _center,
infoWindow: InfoWindow(
title: 'San Francisco',
snippet: 'Population: 800,000+',
),
),
]),
);
}
}
3. 配置 Android 和 iOS
确保你的 AndroidManifest.xml
和 Info.plist
文件中配置了必要的权限和 API 密钥。
对于 Android:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yourapp">
<!-- 添加必要的权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<application
... >
<!-- 添加 API 密钥 -->
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="YOUR_API_KEY_HERE" />
...
</application>
</manifest>
对于 iOS:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>GOOGLE_API_KEY</key>
<string>YOUR_API_KEY_HERE</string>
请注意,上述代码和配置是基于假设的 google_maps_widget
库。如果你实际使用的是 google_maps_flutter
或其他类似的库,请参考其官方文档进行适当的调整。此外,确保你的 API 密钥已经正确配置,并且你的应用已经获得了必要的权限。