[cupertino_ui] Migrate nav_bar_test.dart to SemanticsHandle#11980
Conversation
There was a problem hiding this comment.
Code Review
This pull request removes the skip annotation and custom SemanticsTester from nav_bar_test.dart, refactoring the semantics tests to use tester.ensureSemantics() and isSemantics. The review feedback suggests registering the disposal of SemanticsHandle using addTearDown immediately after creation to prevent resource leaks if assertions fail, and removing the redundant manual dispose calls.
|
|
||
| testWidgets('CupertinoSliverNavigationBar has semantics', (WidgetTester tester) async { | ||
| final semantics = SemanticsTester(tester); | ||
| final SemanticsHandle handle = tester.ensureSemantics(); |
There was a problem hiding this comment.
If the expect assertion fails, the test execution will halt immediately, and handle.dispose() at the end of the test will not be called. This leaves the global semantics state enabled, which can cause side effects or failures in subsequent tests. Registering the disposal with addTearDown immediately after creation ensures it is always cleaned up properly.
final SemanticsHandle handle = tester.ensureSemantics();
addTearDown(handle.dispose);There was a problem hiding this comment.
This is how the test was previously structured, no addTearDown was previously used. Also explanation from gemini below as to why the test fails if we do use addTearDown(handle.dispose).
From gemini:
Flutter's TestWidgetsFlutterBinding runs its end-of-test leak verifications (specifically _verifySemanticsHandlesWereDisposed) inside the test body execution flow, immediately after your test callback completes, but before returning control to the Dart test runner:
1. [Test Runner] Starts test
2. [Flutter Binding] Runs test body (your async callback)
3. Your test code executes...
4. Your test code completes.
5. [Flutter Binding] Runs _endOfTestVerifications() <-- CRITICAL POINT
6. Checking active SemanticsHandles...
ERROR: "A SemanticsHandle was active at the end of the test."
7. [Test Runner] Runs addTearDown callbacks <-- TOO LATE!
8. handle.dispose() is called here.
Because the verification (Step 5) happens before the test runner runs the teardown callbacks (Step 7), the binding sees that the SemanticsHandle is still active and throws a FlutterError, failing the test.
There was a problem hiding this comment.
ensureSemantics is no longer needed.
| ); | ||
|
|
||
| semantics.dispose(); | ||
| handle.dispose(); |
There was a problem hiding this comment.
|
|
||
| testWidgets('CupertinoNavigationBar has semantics', (WidgetTester tester) async { | ||
| final semantics = SemanticsTester(tester); | ||
| final SemanticsHandle handle = tester.ensureSemantics(); |
There was a problem hiding this comment.
If the expect assertion fails, the test execution will halt immediately, and handle.dispose() at the end of the test will not be called. This leaves the global semantics state enabled, which can cause side effects or failures in subsequent tests. Registering the disposal with addTearDown immediately after creation ensures it is always cleaned up properly.
final SemanticsHandle handle = tester.ensureSemantics();
addTearDown(handle.dispose);There was a problem hiding this comment.
| ); | ||
|
|
||
| semantics.dispose(); | ||
| handle.dispose(); |
There was a problem hiding this comment.
|
|
||
| testWidgets('Large CupertinoNavigationBar has semantics', (WidgetTester tester) async { | ||
| final semantics = SemanticsTester(tester); | ||
| final SemanticsHandle handle = tester.ensureSemantics(); |
There was a problem hiding this comment.
If the expect assertion fails, the test execution will halt immediately, and handle.dispose() at the end of the test will not be called. This leaves the global semantics state enabled, which can cause side effects or failures in subsequent tests. Registering the disposal with addTearDown immediately after creation ensures it is always cleaned up properly.
final SemanticsHandle handle = tester.ensureSemantics();
addTearDown(handle.dispose);There was a problem hiding this comment.
| ); | ||
|
|
||
| semantics.dispose(); | ||
| handle.dispose(); |
There was a problem hiding this comment.
nav_bar_test.dart to SemanticsHandlenav_bar_test.dart to SemanticsHandle
justinmc
left a comment
There was a problem hiding this comment.
LGTM minus ensureSemantics 👍
|
|
||
| testWidgets('CupertinoSliverNavigationBar has semantics', (WidgetTester tester) async { | ||
| final semantics = SemanticsTester(tester); | ||
| final SemanticsHandle handle = tester.ensureSemantics(); |
There was a problem hiding this comment.
ensureSemantics is no longer needed.
…er#188863) flutter/packages@274ed3e...e742106 2026-07-01 rmolivares@renzo-olivares.dev [cupertino_ui] Re-enable `tab_scaffold_test.dart` (flutter/packages#12064) 2026-07-01 jmccandless@google.com [material_ui] Port flutter/flutter flutter#184808 "Remove semantics_tester import from card_test.dart" (flutter/packages#11965) 2026-07-01 rmolivares@renzo-olivares.dev [cupertino_ui] Migrate `sliding_segmented_control_test.dart` to `SemanticsHandle` (flutter/packages#11979) 2026-07-01 rmolivares@renzo-olivares.dev [cupertino_ui] Migrate `route_test.dart` to `SemanticsHandle` (flutter/packages#11993) 2026-07-01 rmolivares@renzo-olivares.dev [cupertino_ui] Migrate `nav_bar_test.dart` to `SemanticsHandle` (flutter/packages#11980) 2026-07-01 rmolivares@renzo-olivares.dev [cupertino_ui] Migrate `segmented_control_test.dart` to `SemanticsHandle` (flutter/packages#11982) 2026-07-01 rmolivares@renzo-olivares.dev [cupertino_ui] Re-enable `text_field_test.dart` (flutter/packages#12067) 2026-06-30 r.anantheswar@gmail.com [camera_android_camerax] Pass targetVideoEncodingBitRate to Recorder (flutter/packages#11960) 2026-06-30 1063596+reidbaker@users.noreply.github.com [camera_android_camerax] Migrate check-readiness skill from bash to Dart (flutter/packages#11943) 2026-06-30 21270878+elliette@users.noreply.github.com [material_ui] Enable `time_picker_test` (flutter/packages#12061) 2026-06-30 36861262+QuncCccccc@users.noreply.github.com [cupertino_ui] Migrate checkbox_test.dart to SemanticsHandle (flutter/packages#12065) 2026-06-30 64674824+yashas-hm@users.noreply.github.com [image_picker] Handle limit: 1 in pickMultiImage and pickMultipleMedia gracefully (flutter/packages#11825) 2026-06-30 faheemabbas766@gmail.com [cross_file] Document native mimeType behavior (flutter/packages#11662) 2026-06-30 36861262+QuncCccccc@users.noreply.github.com [material_ui] Remove `image_data.dart` imports from `circle_avatar_test.dart`, `color_scheme_test.dart` (flutter/packages#12059) 2026-06-30 36861262+QuncCccccc@users.noreply.github.com [cupertino_ui] Remove `image_data.dart` import from `scaffold_test.dart` (flutter/packages#12060) 2026-06-30 36861262+QuncCccccc@users.noreply.github.com [cupertino_ui] Remove widgets import from menu_anchor_test.dart (flutter/packages#12068) 2026-06-30 21270878+elliette@users.noreply.github.com [material_ui] Enable `checkbox_list_tile_test` (flutter/packages#12007) 2026-06-30 louisehsu@google.com [in_app_purchase_storekit] Expose quantity in Transactions (flutter/packages#11879) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages-flutter-autoroll Please CC flutter-ecosystem@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
Part of flutter/flutter#182636 and flutter/flutter#188395
This PR:
widgets/semantics_tester.dart. ReplacedSemanticsTesterwithSemanticsHandle.@Skipannotation, all tests in this file has passed.semantics_tester.darthas existed incupertino_ui, so we can directly importsemantics_tester.dart;test/folder.Pre-Review Checklist
[shared_preferences]///).