Make sure that a Hero doesn't crash in 0x0 environment#180954
Make sure that a Hero doesn't crash in 0x0 environment#180954auto-submit[bot] merged 3 commits intoflutter:masterfrom
Conversation
There was a problem hiding this comment.
Code Review
This pull request adds a test to address a crash when a Hero widget is in a zero-sized environment. The added test case is a good starting point for ensuring stability.
My main feedback is that the current test only covers a static zero-sized Hero and doesn't trigger a hero transition, which is the scenario that causes the crash described in issue #6537. I've suggested an improved test case that simulates a hero transition within a zero-sized Navigator to more accurately reproduce and verify the fix.
I've also looked through the provided files for the fix itself but couldn't locate it. If the fix is in a separate PR or planned for a future commit, this improved test will be valuable for validating it.
| testWidgets('Hero does not crash at zero area', (WidgetTester tester) async { | ||
| await tester.pumpWidget( | ||
| const Directionality( | ||
| textDirection: TextDirection.ltr, | ||
| child: Center( | ||
| child: SizedBox.shrink( | ||
| child: Hero(tag: 'imageHero', child: Text('X')), | ||
| ), | ||
| ), | ||
| ), | ||
| ); | ||
| expect(tester.getSize(find.byType(Hero)), Size.zero); | ||
| }); |
There was a problem hiding this comment.
This test is a good addition for preventing regressions when rendering a static, zero-sized Hero. However, it doesn't cover the full scenario described in issue #6537, which involves a crash during a hero transition within a zero-sized environment (like a Navigator of size zero).
To ensure the fix is properly validated, I recommend replacing this test with one that triggers a hero animation between two routes inside a zero-sized Navigator. This will more accurately replicate the conditions that lead to the crash.
Here is a suggestion for a more comprehensive test:
testWidgets('Hero transition does not crash in a zero-sized environment', (WidgetTester tester) async {
// This test verifies that a hero transition inside a zero-sized
// navigator does not crash. See https://github.com/flutter/flutter/issues/6537.
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: SizedBox.shrink( // This creates a 0x0 environment for the navigator.
child: Navigator(
initialRoute: '/',
onGenerateRoute: (RouteSettings settings) {
return PageRouteBuilder<void>(
pageBuilder: (BuildContext context, _, __) {
switch (settings.name) {
case '/':
return Center(
child: Hero(
tag: 'hero',
child: GestureDetector(
onTap: () => Navigator.of(context).pushNamed('/next'),
child: const SizedBox(width: 100, height: 100, child: Text('Go')),
),
),
);
case '/next':
return const Center(
child: Hero(
tag: 'hero',
child: SizedBox(width: 200, height: 200, child: Text('Next')),
),
);
}
return const SizedBox.shrink();
},
);
},
),
),
),
);
expect(find.text('Go'), findsOneWidget);
expect(find.text('Next'), findsNothing);
// The hero transition should not crash.
await tester.tap(find.text('Go'));
await tester.pumpAndSettle();
// No crash means the test passes.
expect(find.text('Go'), findsNothing);
expect(find.text('Next'), findsOneWidget);
});References
- The provided test is a good start, but to be effective, it should cover the hero transition scenario described in the related issue, not just the static rendering of a zero-sized hero. (link)
|
autosubmit label was removed for flutter/flutter/180954, because - The status or check suite Mac_arm64 build_tests_2_4 has failed. Please fix the issues identified (or deflake) before re-applying this label. |
Roll Flutter from 48c2475 to bfc9041eb118 (173 revisions) flutter/flutter@48c2475...bfc9041 2026-01-23 [email protected] No longer exiting the application when the RegularWindow is destroyed + resolving the window created promise after runWidget (flutter/flutter#181339) 2026-01-23 [email protected] Remove unnecessary Material import from dialog_test.dart (flutter/flutter#181249) 2026-01-23 [email protected] Roll Skia from 8e516fe6828f to db10db8bd55f (1 revision) (flutter/flutter#181379) 2026-01-23 [email protected] Reset TextFormField to initial value after state change (flutter/flutter#181199) 2026-01-23 [email protected] Roll Dart SDK from 980b2b41d36e to e82d7ad1855e (1 revision) (flutter/flutter#181375) 2026-01-23 [email protected] Roll Skia from 3e86f377d300 to 8e516fe6828f (4 revisions) (flutter/flutter#181370) 2026-01-23 [email protected] Remove unnecessary Material import from sliver_visibility_test (flutter/flutter#181248) 2026-01-23 [email protected] Add bottom navigation bar item semantics label (flutter/flutter#180577) 2026-01-23 [email protected] Make topGap not required for CupertinoSheetTransition (flutter/flutter#181269) 2026-01-23 [email protected] Roll Fuchsia Linux SDK from b4cLyhuxciUC-4zCJ... to n7NohL9DPpEuPjNt9... (flutter/flutter#181365) 2026-01-23 [email protected] Roll Dart SDK from 806f04638561 to 980b2b41d36e (1 revision) (flutter/flutter#181364) 2026-01-23 [email protected] Reland hybrid views test (flutter/flutter#181336) 2026-01-23 [email protected] Revert DropdownMenu non-nullable breaking change (flutter/flutter#181074) 2026-01-23 [email protected] Fix leaks in `flutter_test` tests (flutter/flutter#180879) 2026-01-23 [email protected] Re-enable fragment_shader_tests.dart 'Shader Compiler appropriately pads vec3 uniform arrays' test on Vulkan (flutter/flutter#181292) 2026-01-23 [email protected] [ Tool ] Fix `update-packages` failing due to mismatched dependencies between flutter_tools and the framework (flutter/flutter#181335) 2026-01-23 [email protected] [Impeller] Make dynamically created shader metadata for runtime effects consistent with metadata for built-in shaders (flutter/flutter#181201) 2026-01-23 [email protected] Broaden the applicability of `Color` fix_data rules from flutter/painting.dart (flutter/flutter#181093) 2026-01-23 [email protected] Fixes macOS App.framework not being codesigned or find framework (flutter/flutter#181348) 2026-01-22 [email protected] Roll Fuchsia GN SDK from NAEC5tfgSl8g94nwp... to JLBh4Z9PKsjIJcqDU... (flutter/flutter#181139) 2026-01-22 [email protected] Roll Dart SDK from ab4640ea82e9 to 806f04638561 (2 revisions) (flutter/flutter#181347) 2026-01-22 [email protected] Add ExpansibleController.toggle method. (flutter/flutter#181320) 2026-01-22 [email protected] Fixes Typo in codebase (flutter/flutter#181256) 2026-01-22 [email protected] Roll Skia from 4766615bcc96 to 3e86f377d300 (3 revisions) (flutter/flutter#181346) 2026-01-22 [email protected] Make sure that a Hero doesn't crash in 0x0 environment (flutter/flutter#180954) 2026-01-22 [email protected] Reland "Fix capitalization of the path to FlutterWindowControllerTest.mm in the macOS platform build script" (flutter/flutter#181200) 2026-01-22 [email protected] Roll Skia from 6e9746be8c4a to 4766615bcc96 (3 revisions) (flutter/flutter#181331) 2026-01-22 [email protected] Fix remove material import textfield (flutter/flutter#181254) 2026-01-22 [email protected] Add FlutterFramework as an Xcode SwiftPM local package override (flutter/flutter#179512) 2026-01-22 [email protected] Roll Dart SDK from 7bd4c68b625c to ab4640ea82e9 (1 revision) (flutter/flutter#181324) 2026-01-22 [email protected] Roll Packages from d80c60e to 9010299 (9 revisions) (flutter/flutter#181323) 2026-01-22 [email protected] Roll Dart SDK from 2d53a77adc5d to 7bd4c68b625c (2 revisions) (flutter/flutter#181316) 2026-01-22 [email protected] Roll Skia from 3f6949bc5780 to 6e9746be8c4a (2 revisions) (flutter/flutter#181311) 2026-01-22 [email protected] Roll Skia from ef6efc358b4a to 3f6949bc5780 (2 revisions) (flutter/flutter#181307) 2026-01-22 [email protected] Roll Dart SDK from 5d7c8faf2e41 to 2d53a77adc5d (1 revision) (flutter/flutter#181305) 2026-01-22 [email protected] [Material] update hourFormat to use Dart 3 switch expression (flutter/flutter#181041) 2026-01-22 [email protected] Use null-aware elements in cupertino/nav_bar.dart (flutter/flutter#181237) 2026-01-22 [email protected] Roll Fuchsia Linux SDK from b2KIEXVAlEqImQ9VO... to b4cLyhuxciUC-4zCJ... (flutter/flutter#181297) 2026-01-22 [email protected] Roll pub packages (flutter/flutter#181295) 2026-01-22 [email protected] Enables fragment shader test for impeller (fixes mat2 on vulkan) (flutter/flutter#181013) 2026-01-21 [email protected] Roll Dart SDK from 366200db1aa1 to 5d7c8faf2e41 (4 revisions) (flutter/flutter#181290) 2026-01-21 [email protected] Roll Skia from b5ec89e31f59 to ef6efc358b4a (19 revisions) (flutter/flutter#181289) 2026-01-21 [email protected] fix description for semantics finders (flutter/flutter#181214) 2026-01-21 [email protected] Make sure that an Icon doesn't crash in 0x0 environment (flutter/flutter#181021) 2026-01-21 [email protected] Make sure that a GridPaper doesn't crash in 0x0 environment (flutter/flutter#180906) 2026-01-21 [email protected] Bring Linux coverage out of bringup (flutter/flutter#181280) ...
This is my attempt to handle flutter#6537 for the Hero widget. Co-authored-by: Tong Mu <[email protected]> Co-authored-by: Victor Sanni <[email protected]>
This is my attempt to handle #6537 for the Hero widget.