Flutter地图展示插件mapbox_widget_layer的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter 地图展示插件 mapbox_widget_layer 的使用

mapbox_widget_layer 是一个定制的 Flutter 小部件,用于在 Mapbox 地图上显示动态小部件。该插件允许基于屏幕位置、缩放级别、方位角和倾斜度来创建小部件。

使用说明

  1. 安装 mapbox_gl: 首先,确保你已经在你的项目中安装了 mapbox_gl 包。你可以通过在 pubspec.yaml 文件中添加以下依赖来实现:

    dependencies:
      flutter:
        sdk: flutter
      mapbox_gl: ^0.14.0
      mapbox_widget_layer: ^0.1.0
    
  2. 创建包含 MapboxMapMapboxWidgetLayer 的新小部件: 创建一个新的 Flutter 小部件,并在其中包含一个 Stack 小部件,该小部件内嵌入 MapboxMapMapboxWidgetLayer

小部件渲染选项

有三种小部件渲染选项可供选择:

  1. MapboxItemBuilder: 这种方式提供了所有属性以手动控制小部件的渲染。它会暴露 screenPositionzoombearingtilt 属性,并通过 builder 函数来响应这些属性的变化。

    MapboxItemBuilder(
        builder: (context, screenPosition) {
            debugPrint('${screenPosition.screenPosition}');
            debugPrint('${screenPosition.zoom}');
            debugPrint('${screenPosition.bearing}');
            debugPrint('${screenPosition.tilt}');
            return Container(
              height: 100,
              width: 100,
              color: Colors.blue[200],
              child: const Center(child: Text('builder')),
            );
        },
        size: const Size(100, 100),
        coordinate: const LatLng(49.457647152564334, 11.076190602176172),
    ),
    
  2. MapboxItem: 这种方式不提供自定义渲染选项。它会直接将小部件放置在指定的位置。

    MapboxItem(
        child: Container(
            height: 100,
            width: 100,
            color: Colors.red[200],
            child: const Center(child: Text('item')),
        ),
        size: const Size(100, 100),
        coordinate: const LatLng(49.45800162760231, 11.076150534247994),
    ),
    
  3. MapboxAutoTransformItem: 这种方式自动调整渲染,基于 zoombearingtilt。它允许手动控制 zoomBase(在哪个缩放级别小部件的大小应与像素大小匹配)和 zoomExpFactor(缩放级别的插值指数基数)。

    MapboxAutoTransformItem(
        child: Container(
            height: 100,
            width: 100,
            color: Colors.green[200],
            child: const Center(child: Text('auto')),
        ),
        size: const Size(100, 100),
        coordinate: const LatLng(49.45750295375467, 11.076125061775054),
    ),
    

完整示例

完整的示例代码可以在文件 ./example/main.dart 中找到 此处

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:mapbox_gl/mapbox_gl.dart';
import 'package:mapbox_widget_layer/mapbox_widget_layer.dart';

class MapboxWithWidgetLayer extends StatelessWidget {
  MapboxWithWidgetLayer({Key? key}) : super(key: key);
  final completer = Completer<MapboxMapController>();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Stack(
      children: [
        MapboxMap(
          accessToken: 'ACCESS TOKEN',
          initialCameraPosition: CameraPosition(target: LatLng(0, 0)),
          onMapCreated: (controller) => completer.complete(controller),
        ),
        MapboxWidgetLayer(
          onMapInteractive: (contorller) {},
          controllerFuture: completer.future,
          items: [
            MapboxItem(
              child: Container(
                height: 100,
                width: 100,
                color: Colors.red[200],
                child: const Center(child: Text('item')),
              ),
              size: const Size(100, 100),
              coordinate: const LatLng(49.45800162760231, 11.076150534247994),
            ),
            MapboxItemBuilder(
              builder: (context, screenPosition) {
                debugPrint('${screenPosition.screenPosition}');
                debugPrint('${screenPosition.zoom}');
                debugPrint('${screenPosition.bearing}');
                debugPrint('${screenPosition.tilt}');
                return Container(
                  height: 100,
                  width: 100,
                  color: Colors.blue[200],
                  child: const Center(child: Text('builder')),
                );
              },
              size: const Size(100, 100),
              coordinate: const LatLng(49.457647152564334, 11.076190602176172),
            ),
            MapboxAutoTransformItem(
              child: Container(
                height: 100,
                width: 100,
                color: Colors.green[200],
                child: const Center(child: Text('auto')),
              ),
              size: const Size(100, 100),
              coordinate: const LatLng(49.45750295375467, 11.076125061775054),
            ),
          ],
        ),
      ],
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter应用中使用mapbox_widget_layer插件来展示地图的示例代码。这个插件允许你在Mapbox地图上添加自定义图层。

首先,确保你已经在pubspec.yaml文件中添加了mapbox_widget_layer依赖:

dependencies:
  flutter:
    sdk: flutter
  mapbox_gl: ^0.14.0  # 确保版本与mapbox_widget_layer兼容
  mapbox_widget_layer: ^0.x.x  # 替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你需要配置Mapbox的访问令牌。这通常是通过环境变量来管理的,但为了简单起见,这里直接在代码中设置(生产环境中不推荐这种做法):

import 'package:flutter/material.dart';
import 'package:mapbox_gl/mapbox_gl.dart';
import 'package:mapbox_widget_layer/mapbox_widget_layer.dart';

void main() {
  // 设置Mapbox访问令牌
  MapboxAccessToken.setTestToken('your_mapbox_access_token_here');

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Mapbox Map Example'),
        ),
        body: MapboxMapWithLayerExample(),
      ),
    );
  }
}

class MapboxMapWithLayerExample extends StatefulWidget {
  @override
  _MapboxMapWithLayerExampleState createState() => _MapboxMapWithLayerExampleState();
}

class _MapboxMapWithLayerExampleState extends State<MapboxMapWithLayerExample> {
  MapboxMapController? _controller;

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        MapboxMap(
          accessToken: MapboxAccessToken.testToken,
          initialCameraPosition: CameraPosition(
            target: LatLng(37.7749, -122.4194),
            zoom: 12.0,
          ),
          onMapCreated: (MapboxMapController controller) {
            _controller = controller;
            _addCustomLayer();
          },
        ),
      ],
    );
  }

  void _addCustomLayer() {
    if (_controller != null) {
      final customLayer = MapboxWidgetLayer(
        id: 'custom-layer',
        widgets: [
          Positioned(
            left: 10,
            top: 10,
            child: Container(
              width: 100,
              height: 100,
              color: Colors.red.withOpacity(0.7),
            ),
          ),
        ],
      );

      _controller!.addLayer(customLayer);
    }
  }
}

在这个示例中,我们做了以下几件事:

  1. 设置Mapbox访问令牌:使用MapboxAccessToken.setTestToken设置访问令牌。
  2. 创建Flutter应用:使用MaterialAppScaffold构建基本的应用结构。
  3. 构建地图视图:使用MapboxMap小部件来显示Mapbox地图,并在地图创建完成时通过onMapCreated回调获取MapboxMapController
  4. 添加自定义图层:使用MapboxWidgetLayer创建一个包含简单红色半透明矩形的自定义图层,并将其添加到地图上。

请注意,MapboxWidgetLayer允许你将Flutter小部件作为图层叠加到Mapbox地图上。这只是一个简单的示例,你可以根据需要自定义图层内容和样式。

确保你已经注册并获取了有效的Mapbox访问令牌,并将其替换为示例代码中的占位符。

回到顶部