throttle static method
Throttle loading/updating/pruning tiles such that it only occurs once per
duration
Ignores events where it is one of:
It is assumed (/guaranteed) that these events should not cause the map to move, and therefore, tile changes are not required.
Implementation
static TileUpdateTransformer throttle(Duration duration) {
Timer? timer;
TileUpdateEvent recentEvent;
var trailingCall = false;
void throttleHandler(
TileUpdateEvent event,
EventSink<TileUpdateEvent> sink,
) {
if (wasTriggeredByTap(event)) return;
recentEvent = event;
if (timer == null) {
sink.add(recentEvent);
timer = Timer(duration, () {
timer = null;
if (trailingCall) {
trailingCall = false;
throttleHandler(recentEvent, sink);
}
});
} else {
trailingCall = true;
}
}
return StreamTransformer.fromHandlers(
handleData: throttleHandler,
handleDone: (sink) {
timer?.cancel();
sink.close();
},
);
}