Commit 464109c0 authored by najeira's avatar najeira Committed by Ian Hickson

AppBar shows CloseButton even on custom PageRoute (#15643)

* AppBar accepts custom PageRoute

* remove unused import

* update AUTHORS
parent f69d1259
...@@ -20,3 +20,4 @@ Stefano Rodriguez <hlsroddy@gmail.com> ...@@ -20,3 +20,4 @@ Stefano Rodriguez <hlsroddy@gmail.com>
Yusuke Konishi <yahpeycoy0403@gmail.com> Yusuke Konishi <yahpeycoy0403@gmail.com>
Fredrik Simón <fredrik@fsimon.net> Fredrik Simón <fredrik@fsimon.net>
Ali Bitek <alibitek@protonmail.ch> Ali Bitek <alibitek@protonmail.ch>
Tetsuhiro Ueda <najeira@gmail.com>
...@@ -16,7 +16,6 @@ import 'icon_button.dart'; ...@@ -16,7 +16,6 @@ import 'icon_button.dart';
import 'icons.dart'; import 'icons.dart';
import 'material.dart'; import 'material.dart';
import 'material_localizations.dart'; import 'material_localizations.dart';
import 'page.dart';
import 'scaffold.dart'; import 'scaffold.dart';
import 'tabs.dart'; import 'tabs.dart';
import 'theme.dart'; import 'theme.dart';
...@@ -339,7 +338,7 @@ class _AppBarState extends State<AppBar> { ...@@ -339,7 +338,7 @@ class _AppBarState extends State<AppBar> {
final bool hasDrawer = scaffold?.hasDrawer ?? false; final bool hasDrawer = scaffold?.hasDrawer ?? false;
final bool hasEndDrawer = scaffold?.hasEndDrawer ?? false; final bool hasEndDrawer = scaffold?.hasEndDrawer ?? false;
final bool canPop = parentRoute?.canPop ?? false; final bool canPop = parentRoute?.canPop ?? false;
final bool useCloseButton = parentRoute is MaterialPageRoute<dynamic> && parentRoute.fullscreenDialog; final bool useCloseButton = parentRoute is PageRoute<dynamic> && parentRoute.fullscreenDialog;
IconThemeData appBarIconTheme = widget.iconTheme ?? themeData.primaryIconTheme; IconThemeData appBarIconTheme = widget.iconTheme ?? themeData.primaryIconTheme;
TextStyle centerStyle = widget.textTheme?.title ?? themeData.primaryTextTheme.title; TextStyle centerStyle = widget.textTheme?.title ?? themeData.primaryTextTheme.title;
......
...@@ -411,7 +411,7 @@ void main() { ...@@ -411,7 +411,7 @@ void main() {
}); });
group('close button', () { group('close button', () {
Future<Null> expectCloseIcon(WidgetTester tester, TargetPlatform platform, IconData expectedIcon) async { Future<Null> expectCloseIcon(WidgetTester tester, TargetPlatform platform, IconData expectedIcon, PageRoute<void> routeBuilder()) async {
await tester.pumpWidget( await tester.pumpWidget(
new MaterialApp( new MaterialApp(
theme: new ThemeData(platform: platform), theme: new ThemeData(platform: platform),
...@@ -419,30 +419,56 @@ void main() { ...@@ -419,30 +419,56 @@ void main() {
) )
); );
tester.state<NavigatorState>(find.byType(Navigator)).push(new MaterialPageRoute<void>( tester.state<NavigatorState>(find.byType(Navigator)).push(routeBuilder());
builder: (BuildContext context) {
return new Scaffold(appBar: new AppBar(), body: const Text('Page 2'));
},
fullscreenDialog: true,
));
await tester.pump(); await tester.pump();
await tester.pump(const Duration(seconds: 1)); await tester.pump(const Duration(seconds: 1));
final Icon icon = tester.widget(find.byType(Icon)); final Icon icon = tester.widget(find.byType(Icon));
expect(icon.icon, expectedIcon); expect(icon.icon, expectedIcon);
expect(find.byType(CloseButton), findsOneWidget);
}
PageRoute<void> materialRouteBuilder() {
return new MaterialPageRoute<void>(
builder: (BuildContext context) {
return new Scaffold(appBar: new AppBar(), body: const Text('Page 2'));
},
fullscreenDialog: true,
);
}
PageRoute<void> customPageRouteBuilder() {
return new _CustomPageRoute<void>(
builder: (BuildContext context) {
return new Scaffold(appBar: new AppBar(), body: const Text('Page 2'));
},
fullscreenDialog: true,
);
} }
testWidgets('Close button shows correctly on Android', (WidgetTester tester) async { testWidgets('Close button shows correctly on Android', (WidgetTester tester) async {
await expectCloseIcon(tester, TargetPlatform.android, Icons.close); await expectCloseIcon(tester, TargetPlatform.android, Icons.close, materialRouteBuilder);
}); });
testWidgets('Close button shows correctly on Fuchsia', (WidgetTester tester) async { testWidgets('Close button shows correctly on Fuchsia', (WidgetTester tester) async {
await expectCloseIcon(tester, TargetPlatform.fuchsia, Icons.close); await expectCloseIcon(tester, TargetPlatform.fuchsia, Icons.close, materialRouteBuilder);
}); });
testWidgets('Close button shows correctly on iOS', (WidgetTester tester) async { testWidgets('Close button shows correctly on iOS', (WidgetTester tester) async {
await expectCloseIcon(tester, TargetPlatform.iOS, Icons.close); await expectCloseIcon(tester, TargetPlatform.iOS, Icons.close, materialRouteBuilder);
});
testWidgets('Close button shows correctly with custom page route on Android', (WidgetTester tester) async {
await expectCloseIcon(tester, TargetPlatform.android, Icons.close, customPageRouteBuilder);
});
testWidgets('Close button shows correctly with custom page route on Fuchsia', (WidgetTester tester) async {
await expectCloseIcon(tester, TargetPlatform.fuchsia, Icons.close, customPageRouteBuilder);
});
testWidgets('Close button shows correctly with custom page route on iOS', (WidgetTester tester) async {
await expectCloseIcon(tester, TargetPlatform.iOS, Icons.close, customPageRouteBuilder);
}); });
}); });
...@@ -1119,3 +1145,37 @@ class _ComputeNotchSetterState extends State<_ComputeNotchSetter> { ...@@ -1119,3 +1145,37 @@ class _ComputeNotchSetterState extends State<_ComputeNotchSetter> {
return new Container(); return new Container();
} }
} }
class _CustomPageRoute<T> extends PageRoute<T> {
_CustomPageRoute({
@required this.builder,
RouteSettings settings: const RouteSettings(),
this.maintainState: true,
bool fullscreenDialog: false,
}) : assert(builder != null),
super(settings: settings, fullscreenDialog: fullscreenDialog);
final WidgetBuilder builder;
@override
Duration get transitionDuration => const Duration(milliseconds: 300);
@override
Color get barrierColor => null;
@override
String get barrierLabel => null;
@override
final bool maintainState;
@override
Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
return builder(context);
}
@override
Widget buildTransitions(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
return child;
}
}
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