From 464109c0e74591a710b1e9f6fc9beff6416cbb52 Mon Sep 17 00:00:00 2001 From: najeira Date: Fri, 30 Mar 2018 02:36:03 +0900 Subject: [PATCH] AppBar shows CloseButton even on custom PageRoute (#15643) * AppBar accepts custom PageRoute * remove unused import * update AUTHORS --- AUTHORS | 1 + .../flutter/lib/src/material/app_bar.dart | 3 +- .../flutter/test/material/scaffold_test.dart | 80 ++++++++++++++++--- 3 files changed, 72 insertions(+), 12 deletions(-) diff --git a/AUTHORS b/AUTHORS index 1472643436..26cc1e9641 100644 --- a/AUTHORS +++ b/AUTHORS @@ -20,3 +20,4 @@ Stefano Rodriguez Yusuke Konishi Fredrik Simón Ali Bitek +Tetsuhiro Ueda diff --git a/packages/flutter/lib/src/material/app_bar.dart b/packages/flutter/lib/src/material/app_bar.dart index 5dc56dcc18..06a66332ad 100644 --- a/packages/flutter/lib/src/material/app_bar.dart +++ b/packages/flutter/lib/src/material/app_bar.dart @@ -16,7 +16,6 @@ import 'icon_button.dart'; import 'icons.dart'; import 'material.dart'; import 'material_localizations.dart'; -import 'page.dart'; import 'scaffold.dart'; import 'tabs.dart'; import 'theme.dart'; @@ -339,7 +338,7 @@ class _AppBarState extends State { final bool hasDrawer = scaffold?.hasDrawer ?? false; final bool hasEndDrawer = scaffold?.hasEndDrawer ?? false; final bool canPop = parentRoute?.canPop ?? false; - final bool useCloseButton = parentRoute is MaterialPageRoute && parentRoute.fullscreenDialog; + final bool useCloseButton = parentRoute is PageRoute && parentRoute.fullscreenDialog; IconThemeData appBarIconTheme = widget.iconTheme ?? themeData.primaryIconTheme; TextStyle centerStyle = widget.textTheme?.title ?? themeData.primaryTextTheme.title; diff --git a/packages/flutter/test/material/scaffold_test.dart b/packages/flutter/test/material/scaffold_test.dart index 4e5ea393b1..0429039728 100644 --- a/packages/flutter/test/material/scaffold_test.dart +++ b/packages/flutter/test/material/scaffold_test.dart @@ -411,7 +411,7 @@ void main() { }); group('close button', () { - Future expectCloseIcon(WidgetTester tester, TargetPlatform platform, IconData expectedIcon) async { + Future expectCloseIcon(WidgetTester tester, TargetPlatform platform, IconData expectedIcon, PageRoute routeBuilder()) async { await tester.pumpWidget( new MaterialApp( theme: new ThemeData(platform: platform), @@ -419,30 +419,56 @@ void main() { ) ); - tester.state(find.byType(Navigator)).push(new MaterialPageRoute( - builder: (BuildContext context) { - return new Scaffold(appBar: new AppBar(), body: const Text('Page 2')); - }, - fullscreenDialog: true, - )); + tester.state(find.byType(Navigator)).push(routeBuilder()); await tester.pump(); await tester.pump(const Duration(seconds: 1)); final Icon icon = tester.widget(find.byType(Icon)); expect(icon.icon, expectedIcon); + expect(find.byType(CloseButton), findsOneWidget); + } + + PageRoute materialRouteBuilder() { + return new MaterialPageRoute( + builder: (BuildContext context) { + return new Scaffold(appBar: new AppBar(), body: const Text('Page 2')); + }, + fullscreenDialog: true, + ); + } + + PageRoute customPageRouteBuilder() { + return new _CustomPageRoute( + 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 { - 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 { - 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 { - 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> { return new Container(); } } + +class _CustomPageRoute extends PageRoute { + _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 animation, Animation secondaryAnimation) { + return builder(context); + } + + @override + Widget buildTransitions(BuildContext context, Animation animation, Animation secondaryAnimation, Widget child) { + return child; + } +}