Skip to content

Commit 2369897

Browse files
authored
AppLifecycleListener should dispatch creation and disposal events. (#137840)
1 parent 8375dfd commit 2369897

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

packages/flutter/lib/src/widgets/app_lifecycle_listener.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,15 @@ class AppLifecycleListener with WidgetsBindingObserver, Diagnosticable {
7373
this.onStateChange,
7474
}) : binding = binding ?? WidgetsBinding.instance,
7575
_lifecycleState = (binding ?? WidgetsBinding.instance).lifecycleState {
76+
// TODO(polina-c): stop duplicating code across disposables
77+
// https://github.com/flutter/flutter/issues/137435
78+
if (kFlutterMemoryAllocationsEnabled) {
79+
MemoryAllocations.instance.dispatchObjectCreated(
80+
library: 'package:flutter/widgets.dart',
81+
className: '$AppLifecycleListener',
82+
object: this,
83+
);
84+
}
7685
this.binding.addObserver(this);
7786
}
7887

@@ -174,6 +183,11 @@ class AppLifecycleListener with WidgetsBindingObserver, Diagnosticable {
174183
@mustCallSuper
175184
void dispose() {
176185
assert(_debugAssertNotDisposed());
186+
// TODO(polina-c): stop duplicating code across disposables
187+
// https://github.com/flutter/flutter/issues/137435
188+
if (kFlutterMemoryAllocationsEnabled) {
189+
MemoryAllocations.instance.dispatchObjectDisposed(object: this);
190+
}
177191
binding.removeObserver(this);
178192
assert(() {
179193
_debugDisposed = true;

packages/flutter/test/widgets/app_lifecycle_listener_test.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import 'package:flutter_test/flutter_test.dart';
1010
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
1111

1212
void main() {
13-
late AppLifecycleListener listener;
13+
AppLifecycleListener? listener;
1414

1515
Future<void> setAppLifeCycleState(AppLifecycleState state) async {
1616
final ByteData? message = const StringCodec().encodeMessage(state.toString());
@@ -40,7 +40,8 @@ void main() {
4040
});
4141

4242
tearDown(() {
43-
listener.dispose();
43+
listener?.dispose();
44+
listener = null;
4445
final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.instance;
4546
binding.resetLifecycleState();
4647
binding.platformDispatcher.resetInitialLifecycleState();
@@ -163,6 +164,16 @@ void main() {
163164
await sendAppExitRequest();
164165
expect(exitRequested, isTrue);
165166
});
167+
168+
test('AppLifecycleListener dispatches memory events', () async {
169+
await expectLater(
170+
await memoryEvents(
171+
() => AppLifecycleListener(binding: WidgetsBinding.instance).dispose(),
172+
AppLifecycleListener,
173+
),
174+
areCreateAndDispose,
175+
);
176+
});
166177
}
167178

168179
class TestAppLifecycleListener extends AppLifecycleListener {

0 commit comments

Comments
 (0)