Flutter地图服务插件tencent_map_flutter的使用

发布于 1周前 作者 htzhanglong 来自 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密钥。

  1. 前往 Tencent Map Service Console,展开“应用管理”菜单并选择“我的应用”。
  2. 点击右侧的“创建应用”,如果已经创建了应用,则可以直接选择“添加密钥”。
  3. 在面板中勾选“Map SDK”功能,并可选地在下方输入框中填写授权包名(密钥只能用于对应包名的应用)。

Android配置

  1. example/android/app/build.gradle 中设置 minSdkVersion

    android {
        defaultConfig {
            minSdkVersion 21
        }
    }
    

    这意味着应用仅适用于运行Android SDK 21或更高版本的用户。

  2. 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.mios/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

1 回复

更多关于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 项目中,按照以下步骤进行集成:

  1. 配置 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)
        }
      }
      
  2. 在 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 密钥。此外,确保你的设备或模拟器有必要的权限来获取位置信息。

回到顶部