SemanticsHandle should dispatch creation and disposal events. (#137960)

This commit is contained in:
Kostia Sokolovskyi 2023-11-06 23:14:42 +01:00 committed by GitHub
parent 4880aab113
commit c0b21b16ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 1 deletions

View File

@ -822,6 +822,16 @@ typedef LayoutCallback<T extends Constraints> = void Function(T constraints);
class _LocalSemanticsHandle implements SemanticsHandle {
_LocalSemanticsHandle._(PipelineOwner owner, this.listener)
: _owner = owner {
// TODO(polina-c): stop duplicating code across disposables
// https://github.com/flutter/flutter/issues/137435
if (kFlutterMemoryAllocationsEnabled) {
MemoryAllocations.instance.dispatchObjectCreated(
library: 'package:flutter/rendering.dart',
className: '$_LocalSemanticsHandle',
object: this,
);
}
if (listener != null) {
_owner.semanticsOwner!.addListener(listener!);
}
@ -834,6 +844,12 @@ class _LocalSemanticsHandle implements SemanticsHandle {
@override
void dispose() {
// TODO(polina-c): stop duplicating code across disposables
// https://github.com/flutter/flutter/issues/137435
if (kFlutterMemoryAllocationsEnabled) {
MemoryAllocations.instance.dispatchObjectDisposed(object: this);
}
if (listener != null) {
_owner.semanticsOwner!.removeListener(listener!);
}

View File

@ -191,7 +191,17 @@ mixin SemanticsBinding on BindingBase {
///
/// To obtain a [SemanticsHandle], call [SemanticsBinding.ensureSemantics].
class SemanticsHandle {
SemanticsHandle._(this._onDispose);
SemanticsHandle._(this._onDispose) {
// TODO(polina-c): stop duplicating code across disposables
// https://github.com/flutter/flutter/issues/137435
if (kFlutterMemoryAllocationsEnabled) {
MemoryAllocations.instance.dispatchObjectCreated(
library: 'package:flutter/semantics.dart',
className: '$SemanticsHandle',
object: this,
);
}
}
final VoidCallback _onDispose;
@ -201,6 +211,12 @@ class SemanticsHandle {
/// framework will stop generating semantics information.
@mustCallSuper
void dispose() {
// TODO(polina-c): stop duplicating code across disposables
// https://github.com/flutter/flutter/issues/137435
if (kFlutterMemoryAllocationsEnabled) {
MemoryAllocations.instance.dispatchObjectDisposed(object: this);
}
_onDispose();
}
}

View File

@ -82,4 +82,14 @@ void main() {
expect(SemanticsBinding.instance.semanticsEnabled, isFalse);
expect(tester.binding.pipelineOwner.semanticsOwner, isNull);
}, semanticsEnabled: false);
test('SemanticsHandle dispatches memory events', () async {
await expectLater(
await memoryEvents(
() => SemanticsBinding.instance.ensureSemantics().dispose(),
SemanticsHandle,
),
areCreateAndDispose,
);
});
}