Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 18 additions & 11 deletions lib/screens/bus_map_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -854,14 +854,7 @@ class _BusMapScreenState extends State<BusMapScreen>

final map = _unsupported
? _buildUnsupportedNotice(theme)
: ValueListenableBuilder<int>(
valueListenable: _animationTick,
builder: (context, _, _) => _buildMap(
theme,
drawSet,
controller.settings.mobileMapProvider,
),
);
: _buildMap(theme, drawSet, controller.settings.mobileMapProvider);

final overlay = Stack(
children: [
Expand Down Expand Up @@ -1237,14 +1230,19 @@ class _BusMapScreenState extends State<BusMapScreen>
MobileMapProvider mapProvider,
) {
if (useGoogleMapsProviderFor(mapProvider)) {
return _buildGoogleMap(theme, drawSet);
// google_maps_flutter updates markers through widget configuration, so
// its map still needs the animation tick. The FlutterMap backend below
// can isolate ticks to one marker layer instead of rebuilding the map.
return ValueListenableBuilder<int>(
valueListenable: _animationTick,
builder: (context, _, _) => _buildGoogleMap(theme, drawSet),
);
}
return _buildFlutterMap(theme, drawSet);
}

Widget _buildFlutterMap(ThemeData theme, _BusMapDrawSet drawSet) {
final buses = drawSet.buses;
final now = DateTime.now();
final geometry = _selectedGeometry;
return FlutterMap(
mapController: _mapController,
Expand Down Expand Up @@ -1346,7 +1344,16 @@ class _BusMapScreenState extends State<BusMapScreen>
),
],
),
MarkerLayer(markers: _osmBusMarkers(buses, now)),
// A selected route animates four times per second. Keep that hot
// rebuild below FlutterMap so tiles, route geometry, stop pins and
// clusters remain untouched between server snapshots.
ValueListenableBuilder<int>(
valueListenable: _animationTick,
builder: (context, _, _) => MarkerLayer(
key: const ValueKey('bus-map-moving-marker-layer'),
markers: _osmBusMarkers(buses, DateTime.now()),
),
),
],
);
}
Expand Down
42 changes: 42 additions & 0 deletions test/bus_map_screen_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -648,6 +648,48 @@ void main() {
expect(after.longitude, greaterThan(before.longitude));
});

_mapTest('animation ticks rebuild only the moving marker layer', (
tester,
log,
controller,
) async {
await _pumpMap(tester, controller);
await _pumpUntil(
tester,
() => find.byType(BusMapBusMarker).evaluate().length == 2,
);
await _selectTheResolvedBus(tester, log);

final mapBefore = tester.widget<FlutterMap>(find.byType(FlutterMap));
final tileLayerBefore = tester.widget<TileLayer>(find.byType(TileLayer));
final movingLayerBefore = tester.widget<MarkerLayer>(
find.byKey(const ValueKey('bus-map-moving-marker-layer')),
);

await tester.pump(const Duration(milliseconds: 300));

expect(
identical(tester.widget<FlutterMap>(find.byType(FlutterMap)), mapBefore),
isTrue,
);
expect(
identical(
tester.widget<TileLayer>(find.byType(TileLayer)),
tileLayerBefore,
),
isTrue,
);
expect(
identical(
tester.widget<MarkerLayer>(
find.byKey(const ValueKey('bus-map-moving-marker-layer')),
),
movingLayerBefore,
),
isFalse,
);
});

_mapTest('a bus the feed could not pin down is still named', (
tester,
log,
Expand Down
Loading