-
-
Notifications
You must be signed in to change notification settings - Fork 897
Expand file tree
/
Copy pathmany_markers.dart
More file actions
115 lines (106 loc) · 3.56 KB
/
many_markers.dart
File metadata and controls
115 lines (106 loc) · 3.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import 'dart:math';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_map_example/misc/test_marker.dart';
import 'package:flutter_map_example/misc/tile_providers.dart';
import 'package:flutter_map_example/widgets/drawer/menu_drawer.dart';
import 'package:flutter_map_example/widgets/number_of_items_slider.dart';
import 'package:flutter_map_example/widgets/perf_overlay.dart';
import 'package:latlong2/latlong.dart';
const _maxMarkersCount = 20000;
const _londonOrigin = LatLng(51.5074, -0.1278);
/// On this page, [_maxMarkersCount] markers are randomly generated
/// across London, and then you can limit them with a slider
///
/// This way, you can test how map performs under a lot of markers
///
/// The markers are quite expensive - an `Icon` is expensive itself, and adding
/// a `GestureDetector` makes things much slower.
class ManyMarkersPage extends StatefulWidget {
static const String route = '/many_markers';
const ManyMarkersPage({super.key});
@override
ManyMarkersPageState createState() => ManyMarkersPageState();
}
class ManyMarkersPageState extends State<ManyMarkersPage> {
final randomGenerator = Random(10);
late final allMarkers = List.generate(
_maxMarkersCount,
(_) {
final angle = randomGenerator.nextDouble() * 2 * pi;
final distance = randomGenerator.nextDouble() * 0.5;
final latOffset =
distance * sin(angle) * (0.7 + randomGenerator.nextDouble() * 0.6);
final lngOffset =
distance * cos(angle) * (0.7 + randomGenerator.nextDouble() * 0.6);
final point = LatLng(
_londonOrigin.latitude + latOffset,
_londonOrigin.longitude + lngOffset,
);
return Marker(
point: point,
// TODO: Part of what's being tested is removing these w/h. But we can't
// perform culling before build without - but maybe that's not too
// necessary now?
// width: 30,
// height: 30,
child: TestMarker(point: point),
);
},
);
int displayedMarkersCount = _maxMarkersCount ~/ 10;
@override
void initState() {
super.initState();
PerfOverlay.showWebUnavailable(context);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Many Markers')),
drawer: const MenuDrawer(ManyMarkersPage.route),
body: Stack(
children: [
FlutterMap(
options: MapOptions(
initialCameraFit: CameraFit.bounds(
bounds: LatLngBounds(
const LatLng(50, -0.5),
const LatLng(53, 0.3),
),
),
),
children: [
openStreetMapTileLayer,
MarkerLayer(
alignment: Alignment.topCenter,
markers: allMarkers
.take(displayedMarkersCount)
.toList(growable: false),
),
],
),
Positioned(
left: 16,
top: 16,
right: 16,
child: NumberOfItemsSlider(
number: displayedMarkersCount,
onChanged: (v) => setState(() => displayedMarkersCount = v),
maxNumber: _maxMarkersCount,
itemDescription: 'Marker',
),
),
if (!kIsWeb)
const Positioned(
bottom: 8,
left: 0,
right: 0,
child: PerfOverlay(),
),
],
),
);
}
}