Flutter地图服务插件tencent_map_flutter的使用
Flutter地图服务插件tencent_map_flutter的使用
插件介绍
tencent_map_flutter
是一个为Flutter提供的插件,用于在应用中集成腾讯地图。它提供了TencentMap widget,支持Android 21+ 和iOS 12+。
使用方法
要使用此插件,请将 tencent_map_flutter
添加到您的 pubspec.yaml
文件中的依赖项中。
dependencies:
tencent_map_flutter: ^x.x.x
登录和获取API密钥
登录腾讯地图服务控制台,在 https://lbs.qq.com/dev/console/application/mine 获取API密钥。
- 前往 Tencent Map Service Console,展开“应用管理”菜单并选择“我的应用”。
- 点击右侧的“创建应用”,如果已经创建了应用,则可以直接选择“添加密钥”。
- 在面板中勾选“Map SDK”功能,并可选地在下方输入框中填写授权包名(密钥只能用于对应包名的应用)。
Android配置
-
在
example/android/app/build.gradle
中设置minSdkVersion
:android { defaultConfig { minSdkVersion 21 } }
这意味着应用仅适用于运行Android SDK 21或更高版本的用户。
-
在
example/android/app/src/main/AndroidManifest.xml
中指定你的API密钥:<manifest ...> <application ...> <meta-data android:name="TencentMapSDK" android:value="YOUR KEY HERE"/> </code></pre>
iOS配置
在 ios/Runner/AppDelegate.m
或 ios/Runner/AppDelegate.swift
中指定你的API密钥:
Objective-C代码示例:
#import "AppDelegate.h"
#import "GeneratedPluginRegistrant.h"
#import <QMapKit/QMapKit.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[QMapServices sharedServices].APIKey = @"YOUR KEY HERE";
[GeneratedPluginRegistrant registerWithRegistry:self];
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end
Swift代码示例:
import UIKit
import Flutter
import QMapKit
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
QMapServices.shared().apiKey = "YOUR KEY HERE"
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
示例代码
以下是一个完整的示例应用,展示了如何在Flutter应用中使用tencent_map_flutter
插件。
class MapTypesPage extends StatefulWidget {
const MapTypesPage({Key? key}) : super(key: key);
static const title = 'tecenc_map_example';
[@override](/user/override)
State<MapTypesPage> createState() => _MapTypesPageState();
}
class _MapTypesPageState extends State<MapTypesPage> {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text(MapTypesPage.title),
),
body: TencentMap(),
);
}
}
主程序
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:tencent_map_flutter/tencent_map_flutter.dart';
import 'pages/add_remove_marker.dart';
import 'pages/camera_move.dart';
import 'pages/camera_region_move.dart';
import 'pages/flutter_marker.dart';
import 'pages/map_controls.dart';
import 'pages/map_controls_position.dart';
import 'pages/map_events.dart';
import 'pages/map_layers.dart';
import 'pages/map_location.dart';
import 'pages/map_logo_scale.dart';
import 'pages/map_restriction.dart';
import 'pages/map_types.dart';
void main() {
runApp(const App());
}
/// 主程序
class App extends StatefulWidget {
/// 主程序构造函数
const App({Key? key}) : super(key: key);
[@override](/user/override)
State<App> createState() => _AppState();
}
class _AppState extends State<App> {
[@override](/user/override)
void initState() {
super.initState();
TencentMap.init(agreePrivacy: true);
requestLocationPermission();
}
Future<void> requestLocationPermission() async {
var status = await Permission.location.status;
if (status != PermissionStatus.granted) {
await Permission.location.request();
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
child: MaterialApp(
theme: ThemeData(
useMaterial3: true,
colorScheme: const ColorScheme.light(),
),
darkTheme: ThemeData(
useMaterial3: true,
colorScheme: const ColorScheme.dark(),
),
home: Scaffold(
body: ListView(children: [
Item(
MapTypesPage.title,
(_) => const MapTypesPage(),
),
Item(
CameraMovePage.title,
(_) => const CameraMovePage(),
),
Item(
CameraRegionMovePage.title,
(_) => const CameraRegionMovePage(),
),
Item(
MapRestrictionPage.title,
(_) => const MapRestrictionPage(),
),
Item(
MapLayersPage.title,
(_) => const MapLayersPage(),
),
Item(
MapControlsPage.title,
(_) => const MapControlsPage(),
),
Item(
MapControlsPositionPage.title,
(_) => const MapControlsPositionPage(),
),
Item(
MapLogoScalePage.title,
(_) => const MapLogoScalePage(),
),
Item(
MapEventsPage.title,
(_) => const MapEventsPage(),
),
Item(
UserLocationPage.title,
(_) => const UserLocationPage(),
),
Item(
AddRemoveMarkerPage.title,
(_) => const AddRemoveMarkerPage(),
),
Item(
FlutterMarkerPage.title,
(_) => const FlutterMarkerPage(),
),
]),
),
),
);
}
}
/// 示例项目
class Item extends StatelessWidget {
/// 示例标题
final String title;
/// 示例创建器
final Widget Function(BuildContext) Function(BuildContext) builder;
/// 示例项目构造函数
const Item(this.title, this.builder, {Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return ListTile(
title: Text(title),
onTap: () => Navigator.push(context, MaterialPageRoute(builder: builder)),
);
}
}
更多关于Flutter地图服务插件tencent_map_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地图服务插件tencent_map_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用 tencent_map_flutter
插件在 Flutter 中集成腾讯地图服务的代码示例。这个示例展示了如何初始化地图、显示用户位置、以及添加一些基本的地图标记。
首先,确保你已经在你的 Flutter 项目中添加了 tencent_map_flutter
依赖。在 pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
tencent_map_flutter: ^x.y.z # 请替换为最新版本号
然后运行 flutter pub get
来获取依赖。
接下来,在你的 Flutter 项目中,按照以下步骤进行集成:
-
配置 Android 和 iOS 平台:
-
对于 Android,需要在
android/app/src/main/AndroidManifest.xml
中添加必要的权限和 API 密钥:<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.yourapp"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <application ...> <meta-data android:name="com.tencent.mapsdk.key" android:value="YOUR_TENCENT_MAP_KEY"/> </application> </manifest>
-
对于 iOS,需要在
ios/Runner/Info.plist
中添加必要的权限,并在AppDelegate.swift
中设置 API 密钥:<!-- 在 Info.plist 中添加 --> <key>NSLocationWhenInUseUsageDescription</key> <string>需要您的位置信息来显示地图</string> <key>io.flutter.embedded_views_preview</key> <true/>
// 在 AppDelegate.swift 中添加 import UIKit import Flutter import tencent_map_flutter @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { TencentMapPlugin.register(with: application, apiKey: "YOUR_TENCENT_MAP_KEY") GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
-
-
在 Dart 代码中集成腾讯地图:
import 'package:flutter/material.dart'; import 'package:tencent_map_flutter/tencent_map_flutter.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: MapScreen(), ); } } class MapScreen extends StatefulWidget { @override _MapScreenState createState() => _MapScreenState(); } class _MapScreenState extends State<MapScreen> { TencentMapController? _mapController; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('腾讯地图 Flutter 插件示例'), ), body: TencentMap( apiKey: 'YOUR_TENCENT_MAP_KEY', // 请确保此处替换为你的 API 密钥 onMapCreated: (controller) { _mapController = controller; _moveToUserLocation(); }, markers: [ TencentMapMarker( position: LatLng(39.9042, 116.4074), // 北京天安门坐标 title: '天安门', snippet: '北京著名地标', ), ], initialCameraPosition: CameraPosition( target: LatLng(39.9042, 116.4074), zoom: 14.0, ), ), ); } Future<void> _moveToUserLocation() async { if (_mapController != null) { final location = await TencentMapPlugin.getLastKnownLocation(); if (location != null) { _mapController!.animateCamera(CameraUpdate.newLatLngZoom( LatLng(location.latitude, location.longitude), 14.0, )); } } } }
在这个示例中,我们创建了一个简单的 Flutter 应用,其中包含一个腾讯地图。地图在创建时会显示北京天安门的位置,并且会尝试移动到用户的当前位置(如果设备有位置权限并且能够获得位置信息)。
请注意,为了实际运行这个示例,你需要替换 YOUR_TENCENT_MAP_KEY
为你从腾讯地图开发者平台获取的 API 密钥。此外,确保你的设备或模拟器有必要的权限来获取位置信息。