Skip to content

Commit 464109c

Browse files
najeiraHixie
authored andcommitted
AppBar shows CloseButton even on custom PageRoute (flutter#15643)
* AppBar accepts custom PageRoute * remove unused import * update AUTHORS
1 parent f69d125 commit 464109c

File tree

3 files changed

+72
-12
lines changed

3 files changed

+72
-12
lines changed

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@ Stefano Rodriguez <[email protected]>
2020
Yusuke Konishi <[email protected]>
2121
Fredrik Simón <[email protected]>
2222
Ali Bitek <[email protected]>
23+
Tetsuhiro Ueda <[email protected]>

packages/flutter/lib/src/material/app_bar.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import 'icon_button.dart';
1616
import 'icons.dart';
1717
import 'material.dart';
1818
import 'material_localizations.dart';
19-
import 'page.dart';
2019
import 'scaffold.dart';
2120
import 'tabs.dart';
2221
import 'theme.dart';
@@ -339,7 +338,7 @@ class _AppBarState extends State<AppBar> {
339338
final bool hasDrawer = scaffold?.hasDrawer ?? false;
340339
final bool hasEndDrawer = scaffold?.hasEndDrawer ?? false;
341340
final bool canPop = parentRoute?.canPop ?? false;
342-
final bool useCloseButton = parentRoute is MaterialPageRoute<dynamic> && parentRoute.fullscreenDialog;
341+
final bool useCloseButton = parentRoute is PageRoute<dynamic> && parentRoute.fullscreenDialog;
343342

344343
IconThemeData appBarIconTheme = widget.iconTheme ?? themeData.primaryIconTheme;
345344
TextStyle centerStyle = widget.textTheme?.title ?? themeData.primaryTextTheme.title;

packages/flutter/test/material/scaffold_test.dart

Lines changed: 70 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -411,38 +411,64 @@ void main() {
411411
});
412412

413413
group('close button', () {
414-
Future<Null> expectCloseIcon(WidgetTester tester, TargetPlatform platform, IconData expectedIcon) async {
414+
Future<Null> expectCloseIcon(WidgetTester tester, TargetPlatform platform, IconData expectedIcon, PageRoute<void> routeBuilder()) async {
415415
await tester.pumpWidget(
416416
new MaterialApp(
417417
theme: new ThemeData(platform: platform),
418418
home: new Scaffold(appBar: new AppBar(), body: const Text('Page 1')),
419419
)
420420
);
421421

422-
tester.state<NavigatorState>(find.byType(Navigator)).push(new MaterialPageRoute<void>(
423-
builder: (BuildContext context) {
424-
return new Scaffold(appBar: new AppBar(), body: const Text('Page 2'));
425-
},
426-
fullscreenDialog: true,
427-
));
422+
tester.state<NavigatorState>(find.byType(Navigator)).push(routeBuilder());
428423

429424
await tester.pump();
430425
await tester.pump(const Duration(seconds: 1));
431426

432427
final Icon icon = tester.widget(find.byType(Icon));
433428
expect(icon.icon, expectedIcon);
429+
expect(find.byType(CloseButton), findsOneWidget);
430+
}
431+
432+
PageRoute<void> materialRouteBuilder() {
433+
return new MaterialPageRoute<void>(
434+
builder: (BuildContext context) {
435+
return new Scaffold(appBar: new AppBar(), body: const Text('Page 2'));
436+
},
437+
fullscreenDialog: true,
438+
);
439+
}
440+
441+
PageRoute<void> customPageRouteBuilder() {
442+
return new _CustomPageRoute<void>(
443+
builder: (BuildContext context) {
444+
return new Scaffold(appBar: new AppBar(), body: const Text('Page 2'));
445+
},
446+
fullscreenDialog: true,
447+
);
434448
}
435449

436450
testWidgets('Close button shows correctly on Android', (WidgetTester tester) async {
437-
await expectCloseIcon(tester, TargetPlatform.android, Icons.close);
451+
await expectCloseIcon(tester, TargetPlatform.android, Icons.close, materialRouteBuilder);
438452
});
439453

440454
testWidgets('Close button shows correctly on Fuchsia', (WidgetTester tester) async {
441-
await expectCloseIcon(tester, TargetPlatform.fuchsia, Icons.close);
455+
await expectCloseIcon(tester, TargetPlatform.fuchsia, Icons.close, materialRouteBuilder);
442456
});
443457

444458
testWidgets('Close button shows correctly on iOS', (WidgetTester tester) async {
445-
await expectCloseIcon(tester, TargetPlatform.iOS, Icons.close);
459+
await expectCloseIcon(tester, TargetPlatform.iOS, Icons.close, materialRouteBuilder);
460+
});
461+
462+
testWidgets('Close button shows correctly with custom page route on Android', (WidgetTester tester) async {
463+
await expectCloseIcon(tester, TargetPlatform.android, Icons.close, customPageRouteBuilder);
464+
});
465+
466+
testWidgets('Close button shows correctly with custom page route on Fuchsia', (WidgetTester tester) async {
467+
await expectCloseIcon(tester, TargetPlatform.fuchsia, Icons.close, customPageRouteBuilder);
468+
});
469+
470+
testWidgets('Close button shows correctly with custom page route on iOS', (WidgetTester tester) async {
471+
await expectCloseIcon(tester, TargetPlatform.iOS, Icons.close, customPageRouteBuilder);
446472
});
447473
});
448474

@@ -1119,3 +1145,37 @@ class _ComputeNotchSetterState extends State<_ComputeNotchSetter> {
11191145
return new Container();
11201146
}
11211147
}
1148+
1149+
class _CustomPageRoute<T> extends PageRoute<T> {
1150+
_CustomPageRoute({
1151+
@required this.builder,
1152+
RouteSettings settings: const RouteSettings(),
1153+
this.maintainState: true,
1154+
bool fullscreenDialog: false,
1155+
}) : assert(builder != null),
1156+
super(settings: settings, fullscreenDialog: fullscreenDialog);
1157+
1158+
final WidgetBuilder builder;
1159+
1160+
@override
1161+
Duration get transitionDuration => const Duration(milliseconds: 300);
1162+
1163+
@override
1164+
Color get barrierColor => null;
1165+
1166+
@override
1167+
String get barrierLabel => null;
1168+
1169+
@override
1170+
final bool maintainState;
1171+
1172+
@override
1173+
Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
1174+
return builder(context);
1175+
}
1176+
1177+
@override
1178+
Widget buildTransitions(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
1179+
return child;
1180+
}
1181+
}

0 commit comments

Comments
 (0)