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
更多关于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. 处理地图事件
你可以通过 onMapCreated
和 onCameraMove
等回调函数来处理地图事件。例如,当地图初始化完成后,你可以获取 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),
),
);
}