diff --git a/packages/flutter/lib/src/cupertino/nav_bar.dart b/packages/flutter/lib/src/cupertino/nav_bar.dart index a4c39c422d94..a1395cdf75f5 100644 --- a/packages/flutter/lib/src/cupertino/nav_bar.dart +++ b/packages/flutter/lib/src/cupertino/nav_bar.dart @@ -1770,12 +1770,16 @@ class _NavigationBarTransition extends StatelessWidget { // The actual outer box is big enough to contain both the bottom and top // navigation bars. It's not a direct Rect lerp because some components // can actually be outside the linearly lerp'ed Rect in the middle of - // the animation, such as the topLargeTitle. - return SizedBox( - height: math.max(heightTween.begin!, heightTween.end!) + MediaQuery.paddingOf(context).top, - width: double.infinity, - child: Stack( - children: children, + // the animation, such as the topLargeTitle. The textScaleFactor is kept + // at 1 to avoid odd transitions between pages. + return MediaQuery( + data: MediaQuery.of(context).copyWith(textScaleFactor: 1), + child: SizedBox( + height: math.max(heightTween.begin!, heightTween.end!) + MediaQuery.paddingOf(context).top, + width: double.infinity, + child: Stack( + children: children, + ), ), ); } diff --git a/packages/flutter/test/cupertino/nav_bar_transition_test.dart b/packages/flutter/test/cupertino/nav_bar_transition_test.dart index a1e04afbacda..029b77057940 100644 --- a/packages/flutter/test/cupertino/nav_bar_transition_test.dart +++ b/packages/flutter/test/cupertino/nav_bar_transition_test.dart @@ -25,14 +25,18 @@ Future startTransitionBetween( String? toTitle, TextDirection textDirection = TextDirection.ltr, CupertinoThemeData? theme, + double textScale = 1.0, }) async { await tester.pumpWidget( CupertinoApp( theme: theme, builder: (BuildContext context, Widget? navigator) { - return Directionality( - textDirection: textDirection, - child: navigator!, + return MediaQuery( + data: MediaQuery.of(context).copyWith(textScaleFactor: textScale), + child: Directionality( + textDirection: textDirection, + child: navigator!, + ) ); }, home: const Placeholder(), @@ -1225,6 +1229,14 @@ void main() { expect(find.text('Page 1'), findsOneWidget); }); + testWidgets('textScaleFactor is set to 1.0 on transition', (WidgetTester tester) async { + await startTransitionBetween(tester, fromTitle: 'Page 1', textScale: 99); + + await tester.pump(const Duration(milliseconds: 50)); + + expect(tester.firstWidget(flying(tester, find.byType(RichText))).textScaleFactor, 1); + }); + testWidgets('Back swipe gesture cancels properly with transition', (WidgetTester tester) async { await startTransitionBetween( tester,