Unverified Commit c82ddd39 authored by Alex Li's avatar Alex Li Committed by GitHub

Android Q transition by default (#98559)

parent 72080650
...@@ -63,19 +63,24 @@ class MaterialPageRoute<T> extends PageRoute<T> with MaterialRouteTransitionMixi ...@@ -63,19 +63,24 @@ class MaterialPageRoute<T> extends PageRoute<T> with MaterialRouteTransitionMixi
/// A mixin that provides platform-adaptive transitions for a [PageRoute]. /// A mixin that provides platform-adaptive transitions for a [PageRoute].
/// ///
/// {@template flutter.material.materialRouteTransitionMixin} /// {@template flutter.material.materialRouteTransitionMixin}
/// For Android, the entrance transition for the page slides the route upwards /// For Android, the entrance transition for the page zooms in and fades in
/// and fades it in. The exit transition is the same, but in reverse. /// while the exiting page zooms out and fades out. The exit transition is similar,
/// /// but in reverse.
/// The transition is adaptive to the platform and on iOS, the route slides in ///
/// from the right and exits in reverse. The route also shifts to the left in /// For iOS, the page slides in from the right and exits in reverse. The page
/// parallax when another page enters to cover it. (These directions are flipped /// also shifts to the left in parallax when another page enters to cover it.
/// in environments with a right-to-left reading direction.) /// (These directions are flipped in environments with a right-to-left reading
/// direction.)
/// {@endtemplate} /// {@endtemplate}
/// ///
/// See also: /// See also:
/// ///
/// * [PageTransitionsTheme], which defines the default page transitions used /// * [PageTransitionsTheme], which defines the default page transitions used
/// by the [MaterialRouteTransitionMixin.buildTransitions]. /// by the [MaterialRouteTransitionMixin.buildTransitions].
/// * [ZoomPageTransitionsBuilder], which is the default page transition used
/// by the [PageTransitionsTheme].
/// * [CupertinoPageTransitionsBuilder], which is the default page transition
/// for iOS and macOS.
mixin MaterialRouteTransitionMixin<T> on PageRoute<T> { mixin MaterialRouteTransitionMixin<T> on PageRoute<T> {
/// Builds the primary contents of the route. /// Builds the primary contents of the route.
@protected @protected
......
...@@ -151,13 +151,27 @@ void main() { ...@@ -151,13 +151,27 @@ void main() {
), ),
); );
final Finder findACTransform = find.descendant(
of: find.byType(BottomNavigationBar),
matching: find.ancestor(
of: find.text('AC'),
matching: find.byType(Transform),
),
);
final Finder findAlarmTransform = find.descendant(
of: find.byType(BottomNavigationBar),
matching: find.ancestor(
of: find.text('Alarm'),
matching: find.byType(Transform),
),
);
final TextStyle selectedFontStyle = tester.renderObject<RenderParagraph>(find.text('AC')).text.style!; final TextStyle selectedFontStyle = tester.renderObject<RenderParagraph>(find.text('AC')).text.style!;
final TextStyle selectedIcon = _iconStyle(tester, Icons.ac_unit); final TextStyle selectedIcon = _iconStyle(tester, Icons.ac_unit);
final TextStyle unselectedIcon = _iconStyle(tester, Icons.access_alarm); final TextStyle unselectedIcon = _iconStyle(tester, Icons.access_alarm);
expect(selectedFontStyle.fontSize, selectedFontStyle.fontSize); expect(selectedFontStyle.fontSize, selectedFontStyle.fontSize);
// Unselected label has a font size of 22 but is scaled down to be font size 21. // Unselected label has a font size of 22 but is scaled down to be font size 21.
expect( expect(
tester.firstWidget<Transform>(find.ancestor(of: find.text('Alarm'), matching: find.byType(Transform))).transform, tester.firstWidget<Transform>(findAlarmTransform).transform,
equals(Matrix4.diagonal3(Vector3.all(unselectedTextStyle.fontSize! / selectedTextStyle.fontSize!))), equals(Matrix4.diagonal3(Vector3.all(unselectedTextStyle.fontSize! / selectedTextStyle.fontSize!))),
); );
expect(selectedIcon.color, equals(selectedItemColor)); expect(selectedIcon.color, equals(selectedItemColor));
...@@ -179,14 +193,8 @@ void main() { ...@@ -179,14 +193,8 @@ void main() {
expect(_material(tester).elevation, equals(elevation)); expect(_material(tester).elevation, equals(elevation));
expect(_material(tester).color, equals(backgroundColor)); expect(_material(tester).color, equals(backgroundColor));
final Offset selectedBarItem = tester.getCenter( final Offset selectedBarItem = tester.getCenter(findACTransform);
find.ancestor(of: find.text('AC'), final Offset unselectedBarItem = tester.getCenter(findAlarmTransform);
matching: find.byType(Transform))
);
final Offset unselectedBarItem = tester.getCenter(
find.ancestor(of: find.text('Alarm'),
matching: find.byType(Transform))
);
final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse);
await gesture.addPointer(); await gesture.addPointer();
addTearDown(gesture.removePointer); addTearDown(gesture.removePointer);
...@@ -270,13 +278,27 @@ void main() { ...@@ -270,13 +278,27 @@ void main() {
), ),
); );
Finder findDescendantOfBottomNavigationBar(Finder finder) {
return find.descendant(
of: find.byType(BottomNavigationBar),
matching: finder,
);
}
final TextStyle selectedFontStyle = tester.renderObject<RenderParagraph>(find.text('AC')).text.style!; final TextStyle selectedFontStyle = tester.renderObject<RenderParagraph>(find.text('AC')).text.style!;
final TextStyle selectedIcon = _iconStyle(tester, Icons.ac_unit); final TextStyle selectedIcon = _iconStyle(tester, Icons.ac_unit);
final TextStyle unselectedIcon = _iconStyle(tester, Icons.access_alarm); final TextStyle unselectedIcon = _iconStyle(tester, Icons.access_alarm);
expect(selectedFontStyle.fontSize, selectedFontStyle.fontSize); expect(selectedFontStyle.fontSize, selectedFontStyle.fontSize);
// Unselected label has a font size of 22 but is scaled down to be font size 21. // Unselected label has a font size of 22 but is scaled down to be font size 21.
expect( expect(
tester.firstWidget<Transform>(find.ancestor(of: find.text('Alarm'), matching: find.byType(Transform))).transform, tester.firstWidget<Transform>(
findDescendantOfBottomNavigationBar(
find.ancestor(
of: find.text('Alarm'),
matching: find.byType(Transform),
),
),
).transform,
equals(Matrix4.diagonal3(Vector3.all(unselectedTextStyle.fontSize! / selectedTextStyle.fontSize!))), equals(Matrix4.diagonal3(Vector3.all(unselectedTextStyle.fontSize! / selectedTextStyle.fontSize!))),
); );
expect(selectedIcon.color, equals(selectedItemColor)); expect(selectedIcon.color, equals(selectedItemColor));
...@@ -285,13 +307,11 @@ void main() { ...@@ -285,13 +307,11 @@ void main() {
expect(unselectedIcon.fontSize, equals(unselectedIconTheme.size)); expect(unselectedIcon.fontSize, equals(unselectedIconTheme.size));
// There should not be any [Opacity] or [FadeTransition] widgets // There should not be any [Opacity] or [FadeTransition] widgets
// since showUnselectedLabels and showSelectedLabels are true. // since showUnselectedLabels and showSelectedLabels are true.
final Finder findOpacity = find.descendant( final Finder findOpacity = findDescendantOfBottomNavigationBar(
of: find.byType(BottomNavigationBar), find.byType(Opacity),
matching: find.byType(Opacity),
); );
final Finder findFadeTransition = find.descendant( final Finder findFadeTransition = findDescendantOfBottomNavigationBar(
of: find.byType(BottomNavigationBar), find.byType(FadeTransition),
matching: find.byType(FadeTransition),
); );
expect(findOpacity, findsNothing); expect(findOpacity, findsNothing);
expect(findFadeTransition, findsNothing); expect(findFadeTransition, findsNothing);
...@@ -299,8 +319,12 @@ void main() { ...@@ -299,8 +319,12 @@ void main() {
expect(_material(tester).color, equals(backgroundColor)); expect(_material(tester).color, equals(backgroundColor));
final Offset barItem = tester.getCenter( final Offset barItem = tester.getCenter(
find.ancestor(of: find.text('AC'), findDescendantOfBottomNavigationBar(
matching: find.byType(Transform)) find.ancestor(
of: find.text('AC'),
matching: find.byType(Transform),
),
),
); );
final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse);
await gesture.addPointer(); await gesture.addPointer();
......
...@@ -467,7 +467,11 @@ void main() { ...@@ -467,7 +467,11 @@ void main() {
home: Material(child: buildTable()), home: Material(child: buildTable()),
)); ));
// The `tester.widget` ensures that there is exactly one upward arrow. // The `tester.widget` ensures that there is exactly one upward arrow.
Transform transformOfArrow = tester.widget<Transform>(find.widgetWithIcon(Transform, Icons.arrow_upward)); final Finder iconFinder = find.descendant(
of: find.byType(DataTable),
matching: find.widgetWithIcon(Transform, Icons.arrow_upward),
);
Transform transformOfArrow = tester.widget<Transform>(iconFinder);
expect( expect(
transformOfArrow.transform.getRotation(), transformOfArrow.transform.getRotation(),
equals(Matrix3.identity()), equals(Matrix3.identity()),
...@@ -479,7 +483,7 @@ void main() { ...@@ -479,7 +483,7 @@ void main() {
)); ));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
// The `tester.widget` ensures that there is exactly one upward arrow. // The `tester.widget` ensures that there is exactly one upward arrow.
transformOfArrow = tester.widget<Transform>(find.widgetWithIcon(Transform, Icons.arrow_upward)); transformOfArrow = tester.widget<Transform>(iconFinder);
expect( expect(
transformOfArrow.transform.getRotation(), transformOfArrow.transform.getRotation(),
equals(Matrix3.rotationZ(math.pi)), equals(Matrix3.rotationZ(math.pi)),
...@@ -515,7 +519,10 @@ void main() { ...@@ -515,7 +519,10 @@ void main() {
home: Material(child: buildTable()), home: Material(child: buildTable()),
)); ));
// The `tester.widget` ensures that there is exactly one upward arrow. // The `tester.widget` ensures that there is exactly one upward arrow.
final Finder iconFinder = find.widgetWithIcon(Transform, Icons.arrow_upward); final Finder iconFinder = find.descendant(
of: find.byType(DataTable),
matching: find.widgetWithIcon(Transform, Icons.arrow_upward),
);
Transform transformOfArrow = tester.widget<Transform>(iconFinder); Transform transformOfArrow = tester.widget<Transform>(iconFinder);
expect( expect(
transformOfArrow.transform.getRotation(), transformOfArrow.transform.getRotation(),
...@@ -565,7 +572,10 @@ void main() { ...@@ -565,7 +572,10 @@ void main() {
home: Material(child: buildTable()), home: Material(child: buildTable()),
)); ));
// The `tester.widget` ensures that there is exactly one upward arrow. // The `tester.widget` ensures that there is exactly one upward arrow.
final Finder iconFinder = find.widgetWithIcon(Transform, Icons.arrow_upward); final Finder iconFinder = find.descendant(
of: find.byType(DataTable),
matching: find.widgetWithIcon(Transform, Icons.arrow_upward),
);
Transform transformOfArrow = tester.widget<Transform>(iconFinder); Transform transformOfArrow = tester.widget<Transform>(iconFinder);
expect( expect(
transformOfArrow.transform.getRotation(), transformOfArrow.transform.getRotation(),
......
...@@ -102,7 +102,12 @@ void main() { ...@@ -102,7 +102,12 @@ void main() {
); );
final RenderBox clipRect = tester.renderObject(find.byType(ClipRect).first); final RenderBox clipRect = tester.renderObject(find.byType(ClipRect).first);
final Transform transform = tester.firstWidget(find.byType(Transform)); final Transform transform = tester.firstWidget(
find.descendant(
of: find.byType(FlexibleSpaceBar),
matching: find.byType(Transform),
),
);
// The current (200) is half way between the min (100) and max (300) and the // The current (200) is half way between the min (100) and max (300) and the
// lerp values used to calculate the scale are 1 and 1.5, so we check for 1.25. // lerp values used to calculate the scale are 1 and 1.5, so we check for 1.25.
......
...@@ -10,10 +10,17 @@ import 'package:flutter_test/flutter_test.dart'; ...@@ -10,10 +10,17 @@ import 'package:flutter_test/flutter_test.dart';
import '../rendering/mock_canvas.dart'; import '../rendering/mock_canvas.dart';
void main() { void main() {
testWidgets('test page transition', (WidgetTester tester) async { testWidgets('test page transition (_FadeUpwardsPageTransition)', (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
home: const Material(child: Text('Page 1')), home: const Material(child: Text('Page 1')),
theme: ThemeData(
pageTransitionsTheme: const PageTransitionsTheme(
builders: <TargetPlatform, PageTransitionsBuilder>{
TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(),
},
),
),
routes: <String, WidgetBuilder>{ routes: <String, WidgetBuilder>{
'/next': (BuildContext context) { '/next': (BuildContext context) {
return const Material(child: Text('Page 2')); return const Material(child: Text('Page 2'));
...@@ -67,7 +74,7 @@ void main() { ...@@ -67,7 +74,7 @@ void main() {
expect(find.text('Page 2'), findsNothing); expect(find.text('Page 2'), findsNothing);
}, variant: TargetPlatformVariant.only(TargetPlatform.android)); }, variant: TargetPlatformVariant.only(TargetPlatform.android));
testWidgets('test page transition', (WidgetTester tester) async { testWidgets('test page transition (CupertinoPageTransition)', (WidgetTester tester) async {
final Key page2Key = UniqueKey(); final Key page2Key = UniqueKey();
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
...@@ -148,6 +155,80 @@ void main() { ...@@ -148,6 +155,80 @@ void main() {
expect(widget1InitialTopLeft == widget1TransientTopLeft, true); expect(widget1InitialTopLeft == widget1TransientTopLeft, true);
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS })); }, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }));
testWidgets('test page transition (_ZoomPageTransition)', (WidgetTester tester) async {
Iterable<T> _findWidgets<T extends Widget>(Finder of) {
return tester.widgetList<T>(
find.ancestor(of: of, matching: find.byType(T)),
);
}
FadeTransition _findForwardFadeTransition(Finder of) {
return _findWidgets<FadeTransition>(of).where(
(FadeTransition t) => t.opacity.status == AnimationStatus.forward,
).first;
}
ScaleTransition _findForwardScaleTransition(Finder of) {
return _findWidgets<ScaleTransition>(of).where(
(ScaleTransition t) => t.scale.status == AnimationStatus.forward,
).first;
}
await tester.pumpWidget(
MaterialApp(
home: const Material(child: Text('Page 1')),
routes: <String, WidgetBuilder>{
'/next': (BuildContext context) {
return const Material(child: Text('Page 2'));
},
},
),
);
tester.state<NavigatorState>(find.byType(Navigator)).pushNamed('/next');
await tester.pump();
await tester.pump(const Duration(milliseconds: 50));
ScaleTransition widget1Scale = _findForwardScaleTransition(find.text('Page 1'));
ScaleTransition widget2Scale = _findForwardScaleTransition(find.text('Page 2'));
FadeTransition widget2Opacity = _findForwardFadeTransition(find.text('Page 2'));
// Page 1 is enlarging, starts from 1.0.
expect(widget1Scale.scale.value, greaterThan(1.0));
// Page 2 is enlarging from the value less than 1.0.
expect(widget2Scale.scale.value, lessThan(1.0));
// Page 2 is becoming none transparent.
expect(widget2Opacity.opacity.value, lessThan(1.0));
await tester.pump(const Duration(milliseconds: 250));
await tester.pump(const Duration(milliseconds: 1));
// Page 2 covers page 1.
expect(find.text('Page 1'), findsNothing);
expect(find.text('Page 2'), isOnstage);
tester.state<NavigatorState>(find.byType(Navigator)).pop();
await tester.pump();
await tester.pump(const Duration(milliseconds: 100));
widget1Scale = _findForwardScaleTransition(find.text('Page 1'));
widget2Scale = _findForwardScaleTransition(find.text('Page 2'));
widget2Opacity = _findForwardFadeTransition(find.text('Page 2'));
// Page 1 is narrowing down, but still larger than 1.0.
expect(widget1Scale.scale.value, greaterThan(1.0));
// Page 2 is smaller than 1.0.
expect(widget2Scale.scale.value, lessThan(1.0));
// Page 2 is becoming transparent.
expect(widget2Opacity.opacity.value, lessThan(1.0));
await tester.pump(const Duration(milliseconds: 200));
await tester.pump(const Duration(milliseconds: 1));
expect(find.text('Page 1'), isOnstage);
expect(find.text('Page 2'), findsNothing);
}, variant: TargetPlatformVariant.only(TargetPlatform.android));
testWidgets('test fullscreen dialog transition', (WidgetTester tester) async { testWidgets('test fullscreen dialog transition', (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
const MaterialApp( const MaterialApp(
......
...@@ -13,15 +13,30 @@ void main() { ...@@ -13,15 +13,30 @@ void main() {
final PageTransitionsTheme theme = Theme.of(tester.element(find.text('home'))).pageTransitionsTheme; final PageTransitionsTheme theme = Theme.of(tester.element(find.text('home'))).pageTransitionsTheme;
expect(theme.builders, isNotNull); expect(theme.builders, isNotNull);
for (final TargetPlatform platform in TargetPlatform.values) { for (final TargetPlatform platform in TargetPlatform.values) {
if (platform == TargetPlatform.fuchsia) { switch (platform) {
// No builder on Fuchsia. case TargetPlatform.android:
continue; case TargetPlatform.iOS:
case TargetPlatform.macOS:
expect(
theme.builders[platform],
isNotNull,
reason: 'theme builder for $platform is null',
);
break;
case TargetPlatform.fuchsia:
case TargetPlatform.linux:
case TargetPlatform.windows:
expect(
theme.builders[platform],
isNull,
reason: 'theme builder for $platform is not null',
);
break;
} }
expect(theme.builders[platform], isNotNull, reason: 'theme builder for $platform is null');
} }
}); });
testWidgets('Default PageTransitionsTheme builds a CupertionPageTransition', (WidgetTester tester) async { testWidgets('Default PageTransitionsTheme builds a CupertinoPageTransition', (WidgetTester tester) async {
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => Material( '/': (BuildContext context) => Material(
child: TextButton( child: TextButton(
...@@ -47,7 +62,7 @@ void main() { ...@@ -47,7 +62,7 @@ void main() {
expect(find.byType(CupertinoPageTransition), findsOneWidget); expect(find.byType(CupertinoPageTransition), findsOneWidget);
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS })); }, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }));
testWidgets('Default PageTransitionsTheme builds a _FadeUpwardsPageTransition for android', (WidgetTester tester) async { testWidgets('Default PageTransitionsTheme builds a _ZoomPageTransition for android', (WidgetTester tester) async {
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => Material( '/': (BuildContext context) => Material(
child: TextButton( child: TextButton(
...@@ -64,20 +79,20 @@ void main() { ...@@ -64,20 +79,20 @@ void main() {
), ),
); );
Finder findFadeUpwardsPageTransition() { Finder findZoomPageTransition() {
return find.descendant( return find.descendant(
of: find.byType(MaterialApp), of: find.byType(MaterialApp),
matching: find.byWidgetPredicate((Widget w) => '${w.runtimeType}' == '_FadeUpwardsPageTransition'), matching: find.byWidgetPredicate((Widget w) => '${w.runtimeType}' == '_ZoomPageTransition'),
); );
} }
expect(Theme.of(tester.element(find.text('push'))).platform, debugDefaultTargetPlatformOverride); expect(Theme.of(tester.element(find.text('push'))).platform, debugDefaultTargetPlatformOverride);
expect(findFadeUpwardsPageTransition(), findsOneWidget); expect(findZoomPageTransition(), findsOneWidget);
await tester.tap(find.text('push')); await tester.tap(find.text('push'));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.text('page b'), findsOneWidget); expect(find.text('page b'), findsOneWidget);
expect(findFadeUpwardsPageTransition(), findsOneWidget); expect(findZoomPageTransition(), findsOneWidget);
}, variant: TargetPlatformVariant.only(TargetPlatform.android)); }, variant: TargetPlatformVariant.only(TargetPlatform.android));
testWidgets('PageTransitionsTheme override builds a _OpenUpwardsPageTransition', (WidgetTester tester) async { testWidgets('PageTransitionsTheme override builds a _OpenUpwardsPageTransition', (WidgetTester tester) async {
...@@ -120,7 +135,7 @@ void main() { ...@@ -120,7 +135,7 @@ void main() {
expect(findOpenUpwardsPageTransition(), findsOneWidget); expect(findOpenUpwardsPageTransition(), findsOneWidget);
}, variant: TargetPlatformVariant.only(TargetPlatform.android)); }, variant: TargetPlatformVariant.only(TargetPlatform.android));
testWidgets('PageTransitionsTheme override builds a _ZoomPageTransition', (WidgetTester tester) async { testWidgets('PageTransitionsTheme override builds a _FadeUpwardsTransition', (WidgetTester tester) async {
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => Material( '/': (BuildContext context) => Material(
child: TextButton( child: TextButton(
...@@ -136,7 +151,7 @@ void main() { ...@@ -136,7 +151,7 @@ void main() {
theme: ThemeData( theme: ThemeData(
pageTransitionsTheme: const PageTransitionsTheme( pageTransitionsTheme: const PageTransitionsTheme(
builders: <TargetPlatform, PageTransitionsBuilder>{ builders: <TargetPlatform, PageTransitionsBuilder>{
TargetPlatform.android: ZoomPageTransitionsBuilder(), // creates a _ZoomPageTransition TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(), // creates a _FadeUpwardsTransition
}, },
), ),
), ),
...@@ -144,20 +159,20 @@ void main() { ...@@ -144,20 +159,20 @@ void main() {
), ),
); );
Finder findZoomPageTransition() { Finder findFadeUpwardsPageTransition() {
return find.descendant( return find.descendant(
of: find.byType(MaterialApp), of: find.byType(MaterialApp),
matching: find.byWidgetPredicate((Widget w) => '${w.runtimeType}' == '_ZoomPageTransition'), matching: find.byWidgetPredicate((Widget w) => '${w.runtimeType}' == '_FadeUpwardsPageTransition'),
); );
} }
expect(Theme.of(tester.element(find.text('push'))).platform, debugDefaultTargetPlatformOverride); expect(Theme.of(tester.element(find.text('push'))).platform, debugDefaultTargetPlatformOverride);
expect(findZoomPageTransition(), findsOneWidget); expect(findFadeUpwardsPageTransition(), findsOneWidget);
await tester.tap(find.text('push')); await tester.tap(find.text('push'));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.text('page b'), findsOneWidget); expect(find.text('page b'), findsOneWidget);
expect(findZoomPageTransition(), findsOneWidget); expect(findFadeUpwardsPageTransition(), findsOneWidget);
}, variant: TargetPlatformVariant.only(TargetPlatform.android)); }, variant: TargetPlatformVariant.only(TargetPlatform.android));
testWidgets('_ZoomPageTransition only cause child widget built once', (WidgetTester tester) async { testWidgets('_ZoomPageTransition only cause child widget built once', (WidgetTester tester) async {
......
...@@ -70,6 +70,12 @@ Future<void> pumpTestWidget( ...@@ -70,6 +70,12 @@ Future<void> pumpTestWidget(
} }
void main() { void main() {
// Find the exact transform which is the descendant of [UserAccountsDrawerHeader].
final Finder findTransform = find.descendant(
of: find.byType(UserAccountsDrawerHeader),
matching: find.byType(Transform),
);
testWidgets('UserAccountsDrawerHeader test', (WidgetTester tester) async { testWidgets('UserAccountsDrawerHeader test', (WidgetTester tester) async {
await pumpTestWidget(tester); await pumpTestWidget(tester);
...@@ -127,7 +133,7 @@ void main() { ...@@ -127,7 +133,7 @@ void main() {
testWidgets('UserAccountsDrawerHeader icon rotation test', (WidgetTester tester) async { testWidgets('UserAccountsDrawerHeader icon rotation test', (WidgetTester tester) async {
await pumpTestWidget(tester); await pumpTestWidget(tester);
Transform transformWidget = tester.firstWidget(find.byType(Transform)); Transform transformWidget = tester.firstWidget(findTransform);
// Icon is right side up. // Icon is right side up.
expect(transformWidget.transform.getRotation()[0], 1.0); expect(transformWidget.transform.getRotation()[0], 1.0);
...@@ -140,7 +146,7 @@ void main() { ...@@ -140,7 +146,7 @@ void main() {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
await tester.pump(); await tester.pump();
transformWidget = tester.firstWidget(find.byType(Transform)); transformWidget = tester.firstWidget(findTransform);
// Icon has rotated 180 degrees. // Icon has rotated 180 degrees.
expect(transformWidget.transform.getRotation()[0], -1.0); expect(transformWidget.transform.getRotation()[0], -1.0);
...@@ -153,7 +159,7 @@ void main() { ...@@ -153,7 +159,7 @@ void main() {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
await tester.pump(); await tester.pump();
transformWidget = tester.firstWidget(find.byType(Transform)); transformWidget = tester.firstWidget(findTransform);
// Icon has rotated 180 degrees back to the original position. // Icon has rotated 180 degrees back to the original position.
expect(transformWidget.transform.getRotation()[0], 1.0); expect(transformWidget.transform.getRotation()[0], 1.0);
...@@ -178,7 +184,7 @@ void main() { ...@@ -178,7 +184,7 @@ void main() {
), ),
)); ));
Transform transformWidget = tester.firstWidget(find.byType(Transform)); Transform transformWidget = tester.firstWidget(findTransform);
// Icon is right side up. // Icon is right side up.
expect(transformWidget.transform.getRotation()[0], 1.0); expect(transformWidget.transform.getRotation()[0], 1.0);
...@@ -189,7 +195,7 @@ void main() { ...@@ -189,7 +195,7 @@ void main() {
expect(tester.hasRunningAnimations, isFalse); expect(tester.hasRunningAnimations, isFalse);
expect(await tester.pumpAndSettle(), 1); expect(await tester.pumpAndSettle(), 1);
transformWidget = tester.firstWidget(find.byType(Transform)); transformWidget = tester.firstWidget(findTransform);
// Icon has not rotated. // Icon has not rotated.
expect(transformWidget.transform.getRotation()[0], 1.0); expect(transformWidget.transform.getRotation()[0], 1.0);
...@@ -198,7 +204,7 @@ void main() { ...@@ -198,7 +204,7 @@ void main() {
testWidgets('UserAccountsDrawerHeader icon rotation test speeeeeedy', (WidgetTester tester) async { testWidgets('UserAccountsDrawerHeader icon rotation test speeeeeedy', (WidgetTester tester) async {
await pumpTestWidget(tester); await pumpTestWidget(tester);
Transform transformWidget = tester.firstWidget(find.byType(Transform)); Transform transformWidget = tester.firstWidget(findTransform);
// Icon is right side up. // Icon is right side up.
expect(transformWidget.transform.getRotation()[0], 1.0); expect(transformWidget.transform.getRotation()[0], 1.0);
...@@ -230,7 +236,7 @@ void main() { ...@@ -230,7 +236,7 @@ void main() {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
await tester.pump(); await tester.pump();
transformWidget = tester.firstWidget(find.byType(Transform)); transformWidget = tester.firstWidget(findTransform);
// Icon has rotated 180 degrees back to the original position. // Icon has rotated 180 degrees back to the original position.
expect(transformWidget.transform.getRotation()[0], 1.0); expect(transformWidget.transform.getRotation()[0], 1.0);
......
...@@ -728,7 +728,14 @@ Future<void> main() async { ...@@ -728,7 +728,14 @@ Future<void> main() async {
testWidgets('Hero pop transition interrupted by a push', (WidgetTester tester) async { testWidgets('Hero pop transition interrupted by a push', (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp(routes: routes), MaterialApp(
routes: routes,
theme: ThemeData(pageTransitionsTheme: const PageTransitionsTheme(
builders: <TargetPlatform, PageTransitionsBuilder>{
TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(),
},
)),
),
); );
// Pushes MaterialPageRoute '/two'. // Pushes MaterialPageRoute '/two'.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment