Skip to content

Make sure that a Hero doesn't crash in 0x0 environment#180954

Merged
auto-submit[bot] merged 3 commits intoflutter:masterfrom
ahmedsameha1:handle#6537-Hero
Jan 22, 2026
Merged

Make sure that a Hero doesn't crash in 0x0 environment#180954
auto-submit[bot] merged 3 commits intoflutter:masterfrom
ahmedsameha1:handle#6537-Hero

Conversation

@ahmedsameha1
Copy link
Contributor

This is my attempt to handle #6537 for the Hero widget.

@github-actions github-actions bot added the framework flutter/packages/flutter repository. See also f: labels. label Jan 14, 2026
Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +3668 to +3680
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);
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

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
  1. 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)

@dkwingsmt dkwingsmt added the autosubmit Merge PR when tree becomes green via auto submit App label Jan 21, 2026
@auto-submit
Copy link
Contributor

auto-submit bot commented Jan 21, 2026

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.

@auto-submit auto-submit bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Jan 21, 2026
@victorsanni victorsanni added the autosubmit Merge PR when tree becomes green via auto submit App label Jan 22, 2026
@auto-submit auto-submit bot added this pull request to the merge queue Jan 22, 2026
Merged via the queue into flutter:master with commit b6efca7 Jan 22, 2026
71 checks passed
@flutter-dashboard flutter-dashboard bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Jan 22, 2026
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Jan 23, 2026
auto-submit bot pushed a commit to flutter/packages that referenced this pull request Jan 23, 2026
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)
...
flutter-zl pushed a commit to flutter-zl/flutter that referenced this pull request Feb 10, 2026
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]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

framework flutter/packages/flutter repository. See also f: labels.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants