AppBar shows CloseButton even on custom PageRoute (#15643)
* AppBar accepts custom PageRoute
* remove unused import
* update AUTHORS
diff --git a/AUTHORS b/AUTHORS
index 1472643..26cc1e9 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -20,3 +20,4 @@
Yusuke Konishi <yahpeycoy0403@gmail.com>
Fredrik Simón <fredrik@fsimon.net>
Ali Bitek <alibitek@protonmail.ch>
+Tetsuhiro Ueda <najeira@gmail.com>
diff --git a/packages/flutter/lib/src/material/app_bar.dart b/packages/flutter/lib/src/material/app_bar.dart
index 5dc56dc..06a6633 100644
--- a/packages/flutter/lib/src/material/app_bar.dart
+++ b/packages/flutter/lib/src/material/app_bar.dart
@@ -16,7 +16,6 @@
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 @@
final bool hasDrawer = scaffold?.hasDrawer ?? false;
final bool hasEndDrawer = scaffold?.hasEndDrawer ?? 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;
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 4e5ea39..0429039 100644
--- a/packages/flutter/test/material/scaffold_test.dart
+++ b/packages/flutter/test/material/scaffold_test.dart
@@ -411,7 +411,7 @@
});
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(
new MaterialApp(
theme: new ThemeData(platform: platform),
@@ -419,30 +419,56 @@
)
);
- tester.state<NavigatorState>(find.byType(Navigator)).push(new MaterialPageRoute<void>(
- builder: (BuildContext context) {
- return new Scaffold(appBar: new AppBar(), body: const Text('Page 2'));
- },
- fullscreenDialog: true,
- ));
+ tester.state<NavigatorState>(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<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 {
- 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 @@
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;
+ }
+}