Flutter地图查看插件map_viewer_widget的使用

Flutter 地图查看插件 MapViewerWidget 的使用

概述

MapViewerWidget 是一个用于展示地图的 Flutter 小部件。它是地图应用程序的基础组件。

截图

特性

MapViewerWidget 具有以下特性:

  • 地图显示
  • 地图旋转
  • 使用 GPS 显示当前位置
  • 使用指南针进行地图旋转
    • 北向上
    • 头向上

开始使用

要将该插件添加到你的项目中,请运行以下命令:

flutter pub add map_viewer_widget

使用示例

以下是 MapViewerWidget 的使用示例。完整的示例代码可以在 /example 文件夹中找到。

示例代码

import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:latlong2/latlong.dart';
import 'package:map_viewer_widget/map_viewer_widget.dart';
import 'package:vector_map_tiles/vector_map_tiles.dart';
import 'package:vector_tile_renderer/vector_tile_renderer.dart' as vtr;

void main() {
  runApp(
    const ProviderScope(
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MapViewerWidget 示例',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'MapViewerWidget 示例'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage({super.key, required this.title});
  final String title;
  final mapController = MapController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: SafeArea(
        child: Stack(
          children: [
            MapViewerWidget(
              options: MapOptions(
                center: LatLng(39.640278, 141.946572),
                zoom: 18,
                maxZoom: 18,
              ),
              mapController: mapController,
              children: [
                VectorTileLayer(
                  theme: _mapTheme(context),
                  tileProviders: TileProviders(
                    {'openmaptiles': _cachingTileProvider(_urlTemplate())},
                  ),
                ),
              ],
            ),
            Positioned(
              right: 20,
              bottom: 120,
              child: Consumer(
                builder: (context, ref, child) {
                  var text = 'none';
                  final navigationStatus =
                      ref.watch(mapViewerStateNotiferProvider).navigationStatus;
                  switch (navigationStatus) {
                    case NavigationStatus.headUp:
                      text = 'headUp';
                      break;
                    case NavigationStatus.northUp:
                      text = 'northUp';
                      break;
                    case NavigationStatus.none:
                      text = 'none';
                      break;
                  }
                  return FloatingActionButton(
                    child: Text(
                      text,
                      style: const TextStyle(
                        fontSize: 10,
                      ),
                    ),
                    onPressed: () {
                      ref
                          .read(mapViewerStateNotiferProvider.notifier)
                          .setNavigationStatus(
                            navigationStatus: NavigationStatus.northUp,
                            mapController: mapController,
                          );
                    },
                  );
                },
              ),
            )
          ],
        ),
      ),
    );
  }

  vtr.Theme _mapTheme(BuildContext context) {
    // 地图通过主题渲染
    // 提供深色主题可以这样做:
    // if (MediaQuery.of(context).platformBrightness == Brightness.dark)
    // return myDarkTheme();
    // return ProvidedThemes.lightTheme();
    return ThemeReader().read(osmBrightJaStyle());
    // return ThemeReader().read(lightThemeData());
  }

  VectorTileProvider _cachingTileProvider(String urlTemplate) {
    return MemoryCacheVectorTileProvider(
      delegate: NetworkVectorTileProvider(
        urlTemplate: urlTemplate,
        // 这是提供者的最大缩放级别,而不是地图的最大缩放级别。
        // 矢量切片被渲染为更大的尺寸以支持更高的缩放级别
        maximumZoom: 14,
      ),
      maxSizeBytes: 1024 * 1024 * 2,
    );
  }

  String _urlTemplate() {
    // Stadia Maps 源 https://docs.stadiamaps.com/vector/
    // return 'https://tiles.stadiamaps.com/data/openmaptiles/{z}/{x}/{y}.pbf?api_key=$apiKey';

    return 'https://tile.openstreetmap.jp/data/planet/{z}/{x}/{y}.pbf';

    // Mapbox 源 https://docs.mapbox.com/api/maps/vector-tiles/#example-request-retrieve-vector-tiles
    // return 'https://api.mapbox.com/v4/mapbox.mapbox-streets-v8/{z}/{x}/{y}.mvt?access_token=$apiKey',
  }
}

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

1 回复

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


map_viewer_widget 是一个 Flutter 插件,用于在应用程序中显示地图视图。它通常用于集成地图功能,如显示位置、标记、路线等。以下是如何使用 map_viewer_widget 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  map_viewer_widget: ^0.1.0  # 请确保使用最新版本

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

2. 导入插件

在你的 Dart 文件中导入 map_viewer_widget

import 'package:map_viewer_widget/map_viewer_widget.dart';

3. 使用 MapViewerWidget

你可以在你的 widget 树中使用 MapViewerWidget 来显示地图。以下是一个简单的示例:

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

class MapScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Map Viewer'),
      ),
      body: MapViewerWidget(
        initialCameraPosition: CameraPosition(
          target: LatLng(37.7749, -122.4194), // 旧金山坐标
          zoom: 12.0,
        ),
        markers: [
          Marker(
            markerId: MarkerId('1'),
            position: LatLng(37.7749, -122.4194),
            infoWindow: InfoWindow(title: 'San Francisco'),
          ),
        ],
      ),
    );
  }
}

4. 配置地图参数

MapViewerWidget 提供了多个参数来配置地图的初始位置、标记、缩放级别等。以下是一些常用的参数:

  • initialCameraPosition: 设置地图的初始位置和缩放级别。
  • markers: 在地图上添加标记。
  • onMapCreated: 当地图初始化完成后调用的回调函数。
  • onCameraMove: 当地图相机移动时调用的回调函数。

5. 处理地图事件

你可以通过 onMapCreatedonCameraMove 等回调函数来处理地图事件。例如,当地图初始化完成后,你可以获取 MapController 来控制地图。

MapController _mapController;

[@override](/user/override)
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('Map Viewer'),
    ),
    body: MapViewerWidget(
      initialCameraPosition: CameraPosition(
        target: LatLng(37.7749, -122.4194),
        zoom: 12.0,
      ),
      onMapCreated: (controller) {
        _mapController = controller;
      },
      markers: [
        Marker(
          markerId: MarkerId('1'),
          position: LatLng(37.7749, -122.4194),
          infoWindow: InfoWindow(title: 'San Francisco'),
        ),
      ],
    ),
    floatingActionButton: FloatingActionButton(
      onPressed: () {
        _mapController.animateCamera(
          CameraUpdate.newLatLng(LatLng(34.0522, -118.2437)), // 洛杉矶坐标
        );
      },
      child: Icon(Icons.location_on),
    ),
  );
}
回到顶部