diff --git a/packages/flutter/lib/src/material/app.dart b/packages/flutter/lib/src/material/app.dart index 205a7f34b4..2d66280a13 100644 --- a/packages/flutter/lib/src/material/app.dart +++ b/packages/flutter/lib/src/material/app.dart @@ -536,6 +536,17 @@ class MaterialApp extends StatefulWidget { @override _MaterialAppState createState() => _MaterialAppState(); + + /// The [HeroController] used for Material page transitions. + /// + /// Used by the [MaterialApp]. + static HeroController createMaterialHeroController() { + return HeroController( + createRectTween: (Rect begin, Rect end) { + return MaterialRectArcTween(begin: begin, end: end); + }, + ); + } } class _MaterialScrollBehavior extends ScrollBehavior { @@ -572,7 +583,7 @@ class _MaterialAppState extends State { @override void initState() { super.initState(); - _heroController = HeroController(createRectTween: _createRectTween); + _heroController = MaterialApp.createMaterialHeroController(); } @override @@ -583,14 +594,10 @@ class _MaterialAppState extends State { // old Navigator won't be disposed (and thus won't unregister with its // observers) until after the new one has been created (because the // Navigator has a GlobalKey). - _heroController = HeroController(createRectTween: _createRectTween); + _heroController = MaterialApp.createMaterialHeroController(); } } - RectTween _createRectTween(Rect begin, Rect end) { - return MaterialRectArcTween(begin: begin, end: end); - } - // Combine the Localizations for Material with the ones contributed // by the localizationsDelegates parameter, if any. Only the first delegate // of a particular LocalizationsDelegate.type is loaded so the diff --git a/packages/flutter/test/material/app_test.dart b/packages/flutter/test/material/app_test.dart index 6ec45adfbe..072790429c 100644 --- a/packages/flutter/test/material/app_test.dart +++ b/packages/flutter/test/material/app_test.dart @@ -834,6 +834,15 @@ void main() { expect(find.text('regular page one'), findsNothing); expect(find.text('regular page two'), findsNothing); }); + + testWidgets('MaterialApp does create HeroController with the MaterialRectArcTween', (WidgetTester tester) async { + final HeroController controller = MaterialApp.createMaterialHeroController(); + final Tween tween = controller.createRectTween( + const Rect.fromLTRB(0.0, 0.0, 10.0, 10.0), + const Rect.fromLTRB(0.0, 0.0, 20.0, 20.0) + ); + expect(tween, isA()); + }); } class MockAccessibilityFeature implements AccessibilityFeatures {