Flutter地图展示插件mapbox_widget_layer的使用
Flutter 地图展示插件 mapbox_widget_layer 的使用
mapbox_widget_layer
是一个定制的 Flutter 小部件,用于在 Mapbox 地图上显示动态小部件。该插件允许基于屏幕位置、缩放级别、方位角和倾斜度来创建小部件。
使用说明
-
安装
mapbox_gl
包: 首先,确保你已经在你的项目中安装了mapbox_gl
包。你可以通过在pubspec.yaml
文件中添加以下依赖来实现:dependencies: flutter: sdk: flutter mapbox_gl: ^0.14.0 mapbox_widget_layer: ^0.1.0
-
创建包含
MapboxMap
和MapboxWidgetLayer
的新小部件: 创建一个新的 Flutter 小部件,并在其中包含一个Stack
小部件,该小部件内嵌入MapboxMap
和MapboxWidgetLayer
。
小部件渲染选项
有三种小部件渲染选项可供选择:
-
MapboxItemBuilder
: 这种方式提供了所有属性以手动控制小部件的渲染。它会暴露screenPosition
、zoom
、bearing
和tilt
属性,并通过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), ),
-
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), ),
-
MapboxAutoTransformItem
: 这种方式自动调整渲染,基于zoom
、bearing
和tilt
。它允许手动控制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
更多关于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);
}
}
}
在这个示例中,我们做了以下几件事:
- 设置Mapbox访问令牌:使用
MapboxAccessToken.setTestToken
设置访问令牌。 - 创建Flutter应用:使用
MaterialApp
和Scaffold
构建基本的应用结构。 - 构建地图视图:使用
MapboxMap
小部件来显示Mapbox地图,并在地图创建完成时通过onMapCreated
回调获取MapboxMapController
。 - 添加自定义图层:使用
MapboxWidgetLayer
创建一个包含简单红色半透明矩形的自定义图层,并将其添加到地图上。
请注意,MapboxWidgetLayer
允许你将Flutter小部件作为图层叠加到Mapbox地图上。这只是一个简单的示例,你可以根据需要自定义图层内容和样式。
确保你已经注册并获取了有效的Mapbox访问令牌,并将其替换为示例代码中的占位符。