Flutter地图展示插件simple_map的使用
Flutter 地图展示插件 simple_map 的使用
simple_map
是一个 Flutter 插件,可以显示一个简单的平面世界地图,并且支持带有动画效果的点。它可以用于实时展示在线用户、设备等。
开始使用
-
在
pubspec.yaml
文件中添加依赖:dependencies: simple_map: ^1.0.0
-
运行命令获取包:
flutter packages get
-
导入库文件:
import 'package:simple_map/simple_map.dart';
特性
- 高性能,即使处理大量数据
- 渲染简单的自定义平面地图
- 渲染带动画效果的点
- 自定义每个点
- 创建带有 TTL(生存时间)的点
- 自定义点动画
- 支持标记
- 支持缩放和移动动画
使用方法
使用 SimpleMapOptions
final mapOptions = SimpleMapOptions(
// 自定义地图图标和投影
// mapIcon: IconData(0xe900, fontFamily: 'MapIcons'),
// projection: ...
mapColor: Colors.grey,
bgColor: Colors.black,
// 默认点颜色
pointColor: Colors.blue,
interactive: true,
// 3D 效果
withShadow: true,
shadowOffset = const Offset(0.0, 0.5),
);
使用 SimpleMapController
final SimpleMapController mapController = SimpleMapController();
// 添加单个点。
mapController.addPoint(SimpleMapPoint());
// 添加点列表
mapController.points = [SimpleMapPoint()];
// 清除地图
mapController.clear();
SimpleMap(
controller: mapController,
options: mapOptions,
),
简单地图示例
SimpleMap(
controller: SimpleMapController(points: [
SimpleMapPoint(
lat: 0.0,
lng: 0.0,
color: Colors.blue,
ttl: Duration(seconds: 100),
)
]),
options: mapOptions,
),
完整示例
以下是一个完整的示例代码,展示了如何使用 simple_map
插件来创建一个具有实时数据更新功能的地图应用:
import 'dart:convert';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:simple_map/simple_map.dart';
import 'package:wakelock/wakelock.dart';
void main() {
runApp(MyApp());
Wakelock.enable();
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Simple Map Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
static Random random = Random();
SimpleMapOptions _mapOptions;
SimpleMapController _mapController;
Ticker _ticker;
List<dynamic> _points = [];
[@override](/user/override)
void initState() {
_mapOptions = SimpleMapOptions(
pointColor: Colors.blue,
);
_mapController = SimpleMapController();
initRealtimeTicker();
loadPoints().then((points) {
_points = points;
generateRandomPoints(1000);
});
super.initState();
}
void initRealtimeTicker() {
_ticker = createTicker((elapsed) {
final sec = elapsed.inSeconds;
if (sec > 3) {
final randMod = random.nextInt(100);
if (randMod == 0) return;
if (sec % randMod == 0) {
final points = generatePoints(
random.nextInt(3),
color: Colors.primaries[random.nextInt(Colors.primaries.length)],
);
if (points.length > 0) {
debugPrint('Point {ttl: ${points.first.ttl}}');
_mapController.points = points;
}
}
}
});
}
Future<List> loadPoints() async {
String points = await rootBundle.loadString('assets/points.json');
return json.decode(points);
}
[@override](/user/override)
void dispose() {
_ticker?.dispose();
super.dispose();
}
void generateRandomPoints(int num) {
assert(_mapController != null);
final List<SimpleMapPoint> points = generatePoints(random.nextInt(num));
_mapController.points = points;
}
List<SimpleMapPoint> generatePoints(
int num, {
int maxTTL = 120,
Color color = Colors.blue,
}) {
if (num <= 0 || _points.length == 0) {
return [];
}
return List.generate(num, (index) {
var p = _points[random.nextInt(_points.length)];
return SimpleMapPoint(
lat: double.tryParse(p[0]),
lng: double.tryParse(p[1]),
color: color,
ttl: Duration(seconds: random.nextInt(maxTTL) + 5),
animator: random.nextInt(3) == 1 ? RayMapPointAnimator() : null,
);
});
}
bool liveEnabled = false;
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Simple Map Demo'),
),
backgroundColor: Color(0xffff9f9f9),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: SimpleMap(
controller: _mapController,
options: _mapOptions,
),
),
],
),
),
persistentFooterButtons: <Widget>[
Text("实时数据"),
Switch(
value: liveEnabled,
onChanged: (value) {
if (value) {
_ticker.start();
} else {
_ticker.stop();
}
setState(() {
liveEnabled = value;
});
},
),
],
floatingActionButton: Wrap(
spacing: 10,
children: [
FloatingActionButton(
onPressed: () {
generateRandomPoints(random.nextInt(10) + 1);
},
tooltip: '添加随机点',
child: Icon(Icons.add_circle),
),
FloatingActionButton(
onPressed: () {
_mapController.flyTo(0, 0, zoom: 5.0);
},
tooltip: '放大',
child: Icon(Icons.zoom_in),
),
FloatingActionButton(
onPressed: () {
final point = generatePoints(1)[0];
_mapController.addMarker(
SimpleMapMarker(
lat: point.lat,
lng: point.lng,
color: Colors.primaries[random.nextInt(Colors.primaries.length)],
image: NetworkImage(
'https://avatars.githubusercontent.com/u/1963342?s=50',
// 'https://avatars.githubusercontent.com/u/14101776?s=50',
),
),
);
},
tooltip: '添加标记',
child: Icon(Icons.add_card),
backgroundColor: Colors.deepOrangeAccent,
),
],
),
);
}
}
更多关于Flutter地图展示插件simple_map的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地图展示插件simple_map的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter中使用simple_map
插件来展示地图的代码案例。请注意,simple_map
插件并不是Flutter社区中广泛使用的官方或知名插件,我假设这里提到的simple_map
是一个假设的或自定义的地图展示插件,类似于Flutter中更流行的flutter_map
或Google Maps插件。为了演示目的,我将提供一个类似功能的代码案例,基于Flutter中常见的地图展示方式。
如果simple_map
确实存在并且与下面的代码结构相似,那么你可以直接参考或调整以下代码。如果simple_map
有不同的API或使用方法,请参考其官方文档。
Flutter项目中使用地图展示插件的示例
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加地图展示插件的依赖。这里以flutter_map
为例,因为它是一个流行的地图展示插件:
dependencies:
flutter:
sdk: flutter
flutter_map: ^0.14.0 # 请检查最新版本号
2. 导入必要的包
在你的Dart文件中导入必要的包:
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong2.dart';
import 'package:flutter_map_marker_cluster/flutter_map_marker_cluster.dart'; // 可选,用于标记聚类
3. 创建地图Widget
接下来,创建一个展示地图的Widget:
class MapScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Map Example'),
),
body: FlutterMap(
options: MapOptions(
center: LatLng(51.5, -0.09), // 地图中心点
zoom: 13.0, // 初始缩放级别
),
layers: [
TileLayerOptions(
urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
subdomains: ['a', 'b', 'c'],
),
MarkerLayerOptions(
markers: [
Marker(
width: 80.0,
height: 80.0,
point: LatLng(51.5, -0.09),
builder: (ctx) => Container(
child: Icon(
Icons.location_on,
color: Colors.red,
size: 40,
),
),
),
],
),
// 如果需要标记聚类,可以添加MarkerClusterLayerOptions
// MarkerClusterLayerOptions(
// markers: yourMarkersList,
// maxClusterRadius: 80,
// builder: (context, markers) {
// return Container(
// child: Text('${markers.length}'),
// );
// },
// ),
],
),
);
}
}
4. 在主程序中展示地图Widget
最后,在你的主程序中展示这个Widget:
void main() {
runApp(MaterialApp(
home: MapScreen(),
));
}
说明
- 上述代码使用了
flutter_map
插件来展示一个基本的地图,并在地图上添加了一个标记。 TileLayerOptions
用于定义地图图层的URL模板和子域名。MarkerLayerOptions
用于在地图上添加标记。LatLng
类用于定义地理坐标。- 如果你需要标记聚类功能,可以取消注释
MarkerClusterLayerOptions
部分的代码,并根据需要调整。
请注意,如果simple_map
插件的API与flutter_map
不同,你需要参考simple_map
的官方文档来调整上述代码。如果你确实在使用一个名为simple_map
的插件,并且它有不同的API,请提供具体的文档或API参考,以便给出更准确的代码示例。