Skip to content

Commit 6214a45

Browse files
fix(example): updated marker stress test to use more stressful markers (fleaflet#2122)
Co-authored-by: JaffaKetchup <[email protected]>
1 parent ec217c3 commit 6214a45

File tree

6 files changed

+155
-90
lines changed

6 files changed

+155
-90
lines changed

example/lib/pages/many_circles.dart

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import 'package:flutter_map/flutter_map.dart';
66
import 'package:flutter_map_example/misc/tile_providers.dart';
77
import 'package:flutter_map_example/widgets/drawer/menu_drawer.dart';
88
import 'package:flutter_map_example/widgets/number_of_items_slider.dart';
9-
import 'package:flutter_map_example/widgets/show_no_web_perf_overlay_snackbar.dart';
9+
import 'package:flutter_map_example/widgets/perf_overlay.dart';
1010
import 'package:latlong2/latlong.dart';
1111

1212
const _maxCirclesCount = 30000;
@@ -28,8 +28,28 @@ class _ManyCirclesPageState extends State<ManyCirclesPage> {
2828
static double doubleInRange(Random source, num start, num end) =>
2929
source.nextDouble() * (end - start) + start;
3030

31-
int numOfCircles = _maxCirclesCount ~/ 10;
32-
List<CircleMarker> allCircles = [];
31+
final randomGenerator = Random();
32+
late List<CircleMarker> allCircles = List.generate(
33+
_maxCirclesCount,
34+
(i) => CircleMarker(
35+
point: LatLng(
36+
doubleInRange(randomGenerator, 37, 55),
37+
doubleInRange(randomGenerator, -9, 30),
38+
),
39+
color: HSLColor.fromAHSL(
40+
1,
41+
i % 360,
42+
1,
43+
doubleInRange(randomGenerator, 0.3, 0.7),
44+
).toColor(),
45+
radius: 5,
46+
useRadiusInMeter: false,
47+
borderStrokeWidth: 0,
48+
borderColor: Colors.black,
49+
),
50+
growable: false,
51+
);
52+
int displayedCirclesCount = _maxCirclesCount ~/ 10;
3353

3454
bool useBorders = false;
3555
bool useRadiusInMeters = false;
@@ -38,26 +58,7 @@ class _ManyCirclesPageState extends State<ManyCirclesPage> {
3858
@override
3959
void initState() {
4060
super.initState();
41-
42-
showNoWebPerfOverlaySnackbar(context);
43-
44-
Future.microtask(() {
45-
final r = Random();
46-
for (double x = 0; x < _maxCirclesCount; x++) {
47-
allCircles.add(
48-
CircleMarker(
49-
point: LatLng(doubleInRange(r, 37, 55), doubleInRange(r, -9, 30)),
50-
color: HSLColor.fromAHSL(1, x % 360, 1, doubleInRange(r, 0.3, 0.7))
51-
.toColor(),
52-
radius: 5,
53-
useRadiusInMeter: false,
54-
borderStrokeWidth: 0,
55-
borderColor: Colors.black,
56-
),
57-
);
58-
}
59-
setState(() {});
60-
});
61+
PerfOverlay.showWebUnavailable(context);
6162
}
6263

6364
@override
@@ -85,7 +86,9 @@ class _ManyCirclesPageState extends State<ManyCirclesPage> {
8586
children: [
8687
openStreetMapTileLayer,
8788
CircleLayer(
88-
circles: allCircles.take(numOfCircles).toList(growable: false),
89+
circles: allCircles
90+
.take(displayedCirclesCount)
91+
.toList(growable: false),
8992
optimizeRadiusInMeters: optimizeRadiusInMeters,
9093
),
9194
],
@@ -98,8 +101,8 @@ class _ManyCirclesPageState extends State<ManyCirclesPage> {
98101
child: Column(
99102
children: [
100103
NumberOfItemsSlider(
101-
number: numOfCircles,
102-
onChanged: (v) => setState(() => numOfCircles = v),
104+
number: displayedCirclesCount,
105+
onChanged: (v) => setState(() => displayedCirclesCount = v),
103106
maxNumber: _maxCirclesCount,
104107
itemDescription: 'Circle',
105108
),
@@ -187,11 +190,11 @@ class _ManyCirclesPageState extends State<ManyCirclesPage> {
187190
),
188191
),
189192
if (!kIsWeb)
190-
Positioned(
191-
bottom: 16,
193+
const Positioned(
194+
bottom: 8,
192195
left: 0,
193196
right: 0,
194-
child: PerformanceOverlay.allEnabled(),
197+
child: PerfOverlay(),
195198
),
196199
],
197200
),

example/lib/pages/many_markers.dart

Lines changed: 63 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,19 @@ import 'package:flutter_map/flutter_map.dart';
66
import 'package:flutter_map_example/misc/tile_providers.dart';
77
import 'package:flutter_map_example/widgets/drawer/menu_drawer.dart';
88
import 'package:flutter_map_example/widgets/number_of_items_slider.dart';
9-
import 'package:flutter_map_example/widgets/show_no_web_perf_overlay_snackbar.dart';
9+
import 'package:flutter_map_example/widgets/perf_overlay.dart';
1010
import 'package:latlong2/latlong.dart';
1111

1212
const _maxMarkersCount = 20000;
13+
const _londonOrigin = LatLng(51.5074, -0.1278);
1314

1415
/// On this page, [_maxMarkersCount] markers are randomly generated
15-
/// across europe, and then you can limit them with a slider
16+
/// across London, and then you can limit them with a slider
1617
///
1718
/// This way, you can test how map performs under a lot of markers
19+
///
20+
/// The markers are quite expensive - an `Icon` is expensive itself, and adding
21+
/// a `GestureDetector` makes things much slower.
1822
class ManyMarkersPage extends StatefulWidget {
1923
static const String route = '/many_markers';
2024

@@ -25,32 +29,56 @@ class ManyMarkersPage extends StatefulWidget {
2529
}
2630

2731
class ManyMarkersPageState extends State<ManyMarkersPage> {
28-
double doubleInRange(Random source, num start, num end) =>
29-
source.nextDouble() * (end - start) + start;
30-
List<Marker> allMarkers = [];
32+
final randomGenerator = Random(10);
33+
late final allMarkers = List.generate(
34+
_maxMarkersCount,
35+
(_) {
36+
final angle = randomGenerator.nextDouble() * 2 * pi;
37+
final distance = randomGenerator.nextDouble() * 0.5;
38+
final latOffset =
39+
distance * sin(angle) * (0.7 + randomGenerator.nextDouble() * 0.6);
40+
final lngOffset =
41+
distance * cos(angle) * (0.7 + randomGenerator.nextDouble() * 0.6);
42+
final position = LatLng(
43+
_londonOrigin.latitude + latOffset,
44+
_londonOrigin.longitude + lngOffset,
45+
);
3146

32-
int numOfMarkers = _maxMarkersCount ~/ 10;
47+
return Marker(
48+
point: position,
49+
width: 30,
50+
height: 30,
51+
child: GestureDetector(
52+
onTap: () => ScaffoldMessenger.of(context).showSnackBar(
53+
SnackBar(
54+
content: Text(
55+
'Tapped existing marker (${position.latitude}, '
56+
'${position.longitude})',
57+
),
58+
duration: const Duration(seconds: 1),
59+
showCloseIcon: true,
60+
),
61+
),
62+
child: Icon(
63+
Icons.location_pin,
64+
size: 30,
65+
color: Color.fromARGB(
66+
255,
67+
randomGenerator.nextInt(256),
68+
randomGenerator.nextInt(256),
69+
randomGenerator.nextInt(256),
70+
),
71+
),
72+
),
73+
);
74+
},
75+
);
76+
int displayedMarkersCount = _maxMarkersCount ~/ 10;
3377

3478
@override
3579
void initState() {
3680
super.initState();
37-
38-
showNoWebPerfOverlaySnackbar(context);
39-
40-
Future.microtask(() {
41-
final r = Random();
42-
for (var x = 0; x < _maxMarkersCount; x++) {
43-
allMarkers.add(
44-
Marker(
45-
point: LatLng(doubleInRange(r, 37, 55), doubleInRange(r, -9, 30)),
46-
height: 12,
47-
width: 12,
48-
child: ColoredBox(color: Colors.blue[900]!),
49-
),
50-
);
51-
}
52-
setState(() {});
53-
});
81+
PerfOverlay.showWebUnavailable(context);
5482
}
5583

5684
@override
@@ -64,39 +92,37 @@ class ManyMarkersPageState extends State<ManyMarkersPage> {
6492
options: MapOptions(
6593
initialCameraFit: CameraFit.bounds(
6694
bounds: LatLngBounds(
67-
const LatLng(55, -9),
68-
const LatLng(37, 30),
69-
),
70-
padding: const EdgeInsets.only(
71-
left: 16,
72-
right: 16,
73-
top: 88,
74-
bottom: 192,
95+
const LatLng(50, -0.5),
96+
const LatLng(53, 0.3),
7597
),
7698
),
7799
),
78100
children: [
79101
openStreetMapTileLayer,
80-
MarkerLayer(markers: allMarkers.take(numOfMarkers).toList()),
102+
MarkerLayer(
103+
markers: allMarkers
104+
.take(displayedMarkersCount)
105+
.toList(growable: false),
106+
),
81107
],
82108
),
83109
Positioned(
84110
left: 16,
85111
top: 16,
86112
right: 16,
87113
child: NumberOfItemsSlider(
88-
number: numOfMarkers,
89-
onChanged: (v) => setState(() => numOfMarkers = v),
114+
number: displayedMarkersCount,
115+
onChanged: (v) => setState(() => displayedMarkersCount = v),
90116
maxNumber: _maxMarkersCount,
91117
itemDescription: 'Marker',
92118
),
93119
),
94120
if (!kIsWeb)
95-
Positioned(
96-
bottom: 16,
121+
const Positioned(
122+
bottom: 8,
97123
left: 0,
98124
right: 0,
99-
child: PerformanceOverlay.allEnabled(),
125+
child: PerfOverlay(),
100126
),
101127
],
102128
),

example/lib/pages/polygon_perf_stress.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'package:flutter/services.dart';
44
import 'package:flutter_map/flutter_map.dart';
55
import 'package:flutter_map_example/misc/tile_providers.dart';
66
import 'package:flutter_map_example/widgets/drawer/menu_drawer.dart';
7-
import 'package:flutter_map_example/widgets/show_no_web_perf_overlay_snackbar.dart';
7+
import 'package:flutter_map_example/widgets/perf_overlay.dart';
88
import 'package:flutter_map_example/widgets/simplification_tolerance_slider.dart';
99
import 'package:latlong2/latlong.dart';
1010

@@ -40,7 +40,7 @@ class _PolygonPerfStressPageState extends State<PolygonPerfStressPage> {
4040
@override
4141
void initState() {
4242
super.initState();
43-
showNoWebPerfOverlaySnackbar(context);
43+
PerfOverlay.showWebUnavailable(context);
4444
}
4545

4646
@override
@@ -193,11 +193,11 @@ class _PolygonPerfStressPageState extends State<PolygonPerfStressPage> {
193193
),
194194
),
195195
if (!kIsWeb)
196-
Positioned(
197-
bottom: 16,
196+
const Positioned(
197+
bottom: 8,
198198
left: 0,
199199
right: 0,
200-
child: PerformanceOverlay.allEnabled(),
200+
child: PerfOverlay(),
201201
),
202202
],
203203
),

example/lib/pages/polyline_perf_stress.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
55
import 'package:flutter_map/flutter_map.dart';
66
import 'package:flutter_map_example/misc/tile_providers.dart';
77
import 'package:flutter_map_example/widgets/drawer/menu_drawer.dart';
8-
import 'package:flutter_map_example/widgets/show_no_web_perf_overlay_snackbar.dart';
8+
import 'package:flutter_map_example/widgets/perf_overlay.dart';
99
import 'package:flutter_map_example/widgets/simplification_tolerance_slider.dart';
1010
import 'package:latlong2/latlong.dart';
1111

@@ -27,7 +27,7 @@ class _PolylinePerfStressPageState extends State<PolylinePerfStressPage> {
2727
void initState() {
2828
super.initState();
2929

30-
showNoWebPerfOverlaySnackbar(context);
30+
PerfOverlay.showWebUnavailable(context);
3131

3232
final random = Random(1234);
3333
for (int i = 1; i < 300000; i++) {
@@ -85,11 +85,11 @@ class _PolylinePerfStressPageState extends State<PolylinePerfStressPage> {
8585
),
8686
),
8787
if (!kIsWeb)
88-
Positioned(
89-
bottom: 16,
88+
const Positioned(
89+
bottom: 8,
9090
left: 0,
9191
right: 0,
92-
child: PerformanceOverlay.allEnabled(),
92+
child: PerfOverlay(),
9393
),
9494
],
9595
),

example/lib/widgets/perf_overlay.dart

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import 'package:flutter/foundation.dart';
2+
import 'package:flutter/material.dart';
3+
4+
class PerfOverlay extends StatefulWidget {
5+
const PerfOverlay({super.key});
6+
7+
static void showWebUnavailable(BuildContext context) {
8+
if (kIsWeb) {
9+
WidgetsBinding.instance.addPostFrameCallback(
10+
(_) => ScaffoldMessenger.of(context).showSnackBar(
11+
const SnackBar(
12+
content: Text('Cannot show performance graph overlay on web'),
13+
),
14+
),
15+
);
16+
}
17+
}
18+
19+
@override
20+
State<PerfOverlay> createState() => _PerfOverlayState();
21+
}
22+
23+
class _PerfOverlayState extends State<PerfOverlay> {
24+
bool showPerformanceChart = false;
25+
26+
@override
27+
Widget build(BuildContext context) {
28+
return Column(
29+
crossAxisAlignment: CrossAxisAlignment.end,
30+
children: [
31+
Padding(
32+
padding: const EdgeInsets.only(right: 8),
33+
child: IconButton.outlined(
34+
onPressed: () => setState(
35+
() => showPerformanceChart = !showPerformanceChart,
36+
),
37+
icon: const Icon(Icons.troubleshoot),
38+
isSelected: showPerformanceChart,
39+
tooltip: 'Show Performance Overlay',
40+
),
41+
),
42+
if (showPerformanceChart)
43+
Padding(
44+
padding: const EdgeInsets.symmetric(vertical: 8),
45+
child: PerformanceOverlay.allEnabled(),
46+
),
47+
],
48+
);
49+
}
50+
}

example/lib/widgets/show_no_web_perf_overlay_snackbar.dart

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)