Flutter插件dgis_flutter的使用_dgis_flutter是一个由 2GIS 提供的插件,用于在 Flutter 应用中集成地图功能

Flutter插件dgis_flutter的使用_dgis_flutter是一个由 2GIS 提供的插件,用于在 Flutter 应用中集成地图功能

dgis_flutter介绍

dgis_flutter 是一个由 2GIS 提供的插件,用于在 Flutter 应用中集成地图功能。

Flutter插件dgis_flutter开始使用

要运行地图功能,你需要以下两个密钥:

  • mapKey:用于 MapGL JS API 和 Android NativeSDK 的密钥。
  • 其他密钥:例如用于 truck-directions 的密钥。

所有与地图相关的操作都是通过 GisMapController 控制器来完成的。该控制器目前还没有绑定到具体的地图实例,并且可以在任何时候创建。它的主要作用是向原生 SDK 发送消息。

示例代码

import 'dart:developer';
import 'dart:typed_data';
import 'dart:ui';
import 'package:dgis_flutter/dgis_flutter.dart';
import 'package:dgis_flutter_example/assets_constant.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: GisScreen(),
    );
  }
}

class GisScreen extends StatefulWidget {
  const GisScreen({Key? key}) : super(key: key);

  [@override](/user/override)
  State<GisScreen> createState() => _GisScreenState();
}

class _GisScreenState extends State<GisScreen> {
  final GisMapController controller = GisMapController();

  late final Future<List<GisMapMarker>> icons;
  List<GisMapMarker> list = [];

  [@override](/user/override)
  void initState() {
    icons = Future.wait([getPngFromAsset(context, AssetPath.iconsPointGrey, 60)])
        .then((value) => [
              GisMapMarker(
                icon: value[0],
                latitude: 52.29778,
                longitude: 104.29639,
                zIndex: 0,
                id: "123456",
              )
            ]);
    super.initState();
  }

  Future<Uint8List> getPngFromAsset(
    BuildContext context,
    String path,
    int width,
  ) async {
    ByteData data = await DefaultAssetBundle.of(context).load(path);
    Codec codec = await instantiateImageCodec(
      data.buffer.asUint8List(),
      targetWidth: width,
    );
    FrameInfo fi = await codec.getNextFrame();
    return (await fi.image.toByteData(format: ImageByteFormat.png))!.buffer.asUint8List();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SizedBox(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height,
        child: ButtonMapWidget(
          controller: controller,
          child: FutureBuilder<List<GisMapMarker>>(
            future: icons,
            builder: (context, snapshot) {
              if (!snapshot.hasData) return const SizedBox();
              list = snapshot.data!;
              return GisMap(
                directoryKey: 'rubyqf9316',
                mapKey: 'b7272230-6bc3-47e9-b24b-0eba73b12fe1',
                useHybridComposition: true,
                controller: controller,
                onTapMarker: (marker) {
                  // 忽略:打印标记ID
                  print(marker.id);
                },
                startCameraPosition: const GisCameraPosition(
                  latitude: 52.29778,
                  longitude: 104.29639,
                  bearing: 85.0,
                  tilt: 25.0,
                  zoom: 14.0,
                ),
              );
            },
          ),
        ),
      ),
    );
  }
}

class ButtonMapWidget extends StatelessWidget {
  final Widget child;
  final GisMapController controller;

  const ButtonMapWidget({Key? key, required this.child, required this.controller}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Stack(
      children: [
        child,
        Align(
          alignment: Alignment.bottomCenter,
          child: Row(
            mainAxisAlignment: MainAxisAlignment.end,
            children: [
              FloatingActionButton(
                child: const Icon(Icons.gps_fixed),
                onPressed: () async {
                  final status = await controller.setCameraPosition(latitude: 55.752425, longitude: 37.613983);
                  log(status);
                },
              ),
              FloatingActionButton(
                child: const Icon(Icons.zoom_in_outlined),
                onPressed: () async {
                  final status = await controller.increaseZoom(duration: 200);
                  log(status);
                },
              ),
              FloatingActionButton(
                child: const Icon(Icons.zoom_out_outlined),
                onPressed: () async {
                  final status = await controller.reduceZoom(duration: 200);
                  log(status);
                },
              ),
              FloatingActionButton(
                child: const Icon(Icons.add),
                onPressed: () async {
                  final status = await controller.setRoute(RoutePosition(
                      finishLatitude: 55.752425,
                      finishLongitude: 37.613983,
                      startLatitude: 55.759909,
                      startLongitude: 37.618806));
                  log(status);
                },
              ),
              FloatingActionButton(
                child: const Icon(Icons.remove),
                onPressed: () async {
                  final status = await controller.removeRoute();
                  log(status);
                },
              ),
            ],
          ),
        ),
      ],
    );
  }
}

更多关于Flutter插件dgis_flutter的使用_dgis_flutter是一个由 2GIS 提供的插件,用于在 Flutter 应用中集成地图功能的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件dgis_flutter的使用_dgis_flutter是一个由 2GIS 提供的插件,用于在 Flutter 应用中集成地图功能的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


dgis_flutter 是一个用于在 Flutter 应用中集成 DGIS 地图服务的插件。DGIS(2GIS)是一个广受欢迎的地图服务,主要在东欧和中亚地区使用,提供了丰富的地图数据、导航、地点搜索等功能。

如果你正在探索如何使用 dgis_flutter 插件,以下是一些基本步骤和指南,帮助你开始:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 dgis_flutter 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  dgis_flutter: ^latest_version

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

2. 配置 API 密钥

在使用 DGIS 地图服务之前,你需要在 DGIS 开发者平台上注册并获取 API 密钥。将 API 密钥配置到你的应用中。

import 'package:dgis_flutter/dgis_flutter.dart';

void main() {
  DGis.initialize('YOUR_API_KEY');
  runApp(MyApp());
}

3. 显示地图

在 Flutter 应用中显示 DGIS 地图非常简单。你可以使用 DGisMap 小部件来嵌入地图。

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

class MapScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('DGIS Map'),
      ),
      body: DGisMap(
        initialPosition: LatLng(55.7558, 37.6176), // 初始地图中心坐标
        initialZoom: 12, // 初始缩放级别
      ),
    );
  }
}

4. 添加标记

你可以在地图上添加标记来显示特定的位置。

DGisMap(
  initialPosition: LatLng(55.7558, 37.6176),
  initialZoom: 12,
  markers: [
    Marker(
      position: LatLng(55.7558, 37.6176),
      icon: 'assets/marker.png', // 自定义标记图标
    ),
  ],
),

5. 处理地图事件

你可以监听地图的各种事件,例如用户点击地图、地图移动等。

DGisMap(
  initialPosition: LatLng(55.7558, 37.6176),
  initialZoom: 12,
  onMapClick: (LatLng position) {
    print('Map clicked at $position');
  },
  onCameraMove: (CameraPosition position) {
    print('Camera moved to $position');
  },
),

6. 地点搜索

dgis_flutter 插件还提供了地点搜索功能,你可以根据关键字搜索地点并在地图上显示结果。

Future<void> searchPlaces(String query) async {
  final results = await DGis.searchPlaces(query);
  results.forEach((place) {
    print('Place: ${place.name}, Location: ${place.position}');
  });
}

7. 导航功能

你还可以使用 DGIS 的导航功能来计算路线并显示在地图上。

Future<void> calculateRoute(LatLng origin, LatLng destination) async {
  final route = await DGis.calculateRoute(origin, destination);
  print('Route distance: ${route.distance}, duration: ${route.duration}');
}

8. 自定义地图样式

你可以通过设置自定义的样式来改变地图的外观。

DGisMap(
  initialPosition: LatLng(55.7558, 37.6176),
  initialZoom: 12,
  mapStyle: MapStyle.dark, // 使用深色地图样式
),

9. 处理权限

在 Android 和 iOS 上,你可能需要处理地图相关的权限,例如位置权限。

import 'package:permission_handler/permission_handler.dart';

Future<void> requestLocationPermission() async {
  final status = await Permission.location.request();
  if (status.isGranted) {
    print('Location permission granted');
  } else {
    print('Location permission denied');
  }
}
回到顶部