-
Notifications
You must be signed in to change notification settings - Fork 97
/
Copy pathpolyline_updates.dart
92 lines (74 loc) · 2.94 KB
/
polyline_updates.dart
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
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
part of apple_maps_flutter;
/// [Polyline] update events to be applied to the [AppleMap].
///
/// Used in [AppleMapController] when the map is updated.
class _PolylineUpdates {
/// Computes [_PolylineUpdates] given previous and current [Polyline]s.
_PolylineUpdates.from(Set<Polyline>? previous, Set<Polyline>? current) {
if (previous == null) {
previous = Set<Polyline>.identity();
}
if (current == null) {
current = Set<Polyline>.identity();
}
final Map<PolylineId, Polyline> previousPolylines =
_keyByPolylineId(previous);
final Map<PolylineId, Polyline> currentPolylines =
_keyByPolylineId(current);
final Set<PolylineId> prevPolylineIds = previousPolylines.keys.toSet();
final Set<PolylineId> currentPolylineIds = currentPolylines.keys.toSet();
Polyline idToCurrentPolyline(PolylineId id) {
return currentPolylines[id]!;
}
final Set<PolylineId> _polylineIdsToRemove =
prevPolylineIds.difference(currentPolylineIds);
final Set<Polyline> _polylinesToAdd = currentPolylineIds
.difference(prevPolylineIds)
.map(idToCurrentPolyline)
.toSet();
final Set<Polyline> _polylinesToChange = currentPolylineIds
.intersection(prevPolylineIds)
.map(idToCurrentPolyline)
.toSet();
polylinesToAdd = _polylinesToAdd;
polylineIdsToRemove = _polylineIdsToRemove;
polylinesToChange = _polylinesToChange;
}
late Set<Polyline> polylinesToAdd;
late Set<PolylineId> polylineIdsToRemove;
late Set<Polyline> polylinesToChange;
Map<String, dynamic> _toMap() {
final Map<String, dynamic> updateMap = <String, dynamic>{};
void addIfNonNull(String fieldName, dynamic value) {
if (value != null) {
updateMap[fieldName] = value;
}
}
addIfNonNull('polylinesToAdd', _serializePolylineSet(polylinesToAdd));
addIfNonNull('polylinesToChange', _serializePolylineSet(polylinesToChange));
addIfNonNull('polylineIdsToRemove',
polylineIdsToRemove.map<dynamic>((PolylineId m) => m.value).toList());
return updateMap;
}
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
if (other is! _PolylineUpdates) return false;
final _PolylineUpdates typedOther = other;
return setEquals(polylinesToAdd, typedOther.polylinesToAdd) &&
setEquals(polylineIdsToRemove, typedOther.polylineIdsToRemove) &&
setEquals(polylinesToChange, typedOther.polylinesToChange);
}
@override
int get hashCode =>
Object.hash(polylinesToAdd, polylineIdsToRemove, polylinesToChange);
@override
String toString() {
return '_PolylineUpdates{polylinesToAdd: $polylinesToAdd, '
'polylineIdsToRemove: $polylineIdsToRemove, '
'polylinesToChange: $polylinesToChange}';
}
}