Skip to content

Commit 0c84e5e

Browse files
committed
feat: add debouncer for SentryWidgetsBindingObserver.didChangeMetrics
1 parent ba56a96 commit 0c84e5e

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'dart:async';
2+
import 'package:flutter/foundation.dart';
3+
4+
class Debouncer {
5+
final int milliseconds;
6+
Timer? _timer;
7+
8+
Debouncer({required this.milliseconds});
9+
10+
void run(VoidCallback action) {
11+
_timer?.cancel();
12+
_timer = Timer(Duration(milliseconds: milliseconds), action);
13+
}
14+
15+
void dispose() {
16+
_timer?.cancel();
17+
}
18+
}

flutter/lib/src/widgets_binding_observer.dart

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'dart:ui';
44
import 'package:flutter/foundation.dart';
55
import 'package:flutter/material.dart';
66
import '../sentry_flutter.dart';
7+
import 'utils/debouncer.dart';
78

89
/// This is a `WidgetsBindingObserver` which can observe some events of a
910
/// Flutter application.
@@ -50,6 +51,8 @@ class SentryWidgetsBindingObserver with WidgetsBindingObserver {
5051
// ignore: deprecated_member_use
5152
final StreamController<SingletonFlutterWindow?> _screenSizeStreamController;
5253

54+
final _didChangeMetricsDebouncer = Debouncer(milliseconds: 100);
55+
5356
/// This method records lifecycle events.
5457
/// It tries to mimic the behavior of ActivityBreadcrumbsIntegration of Sentry
5558
/// Android for lifecycle events.
@@ -88,9 +91,12 @@ class SentryWidgetsBindingObserver with WidgetsBindingObserver {
8891
if (!_options.enableWindowMetricBreadcrumbs) {
8992
return;
9093
}
91-
// ignore: deprecated_member_use
92-
final window = _options.bindingUtils.instance?.window;
93-
_screenSizeStreamController.add(window);
94+
95+
_didChangeMetricsDebouncer.run(() {
96+
// ignore: deprecated_member_use
97+
final window = _options.bindingUtils.instance?.window;
98+
_screenSizeStreamController.add(window);
99+
});
94100
}
95101

96102
void _onScreenSizeChanged(Map<String, dynamic> data) {

0 commit comments

Comments
 (0)