AppBar shows CloseButton even on custom PageRoute (#15643)
* AppBar accepts custom PageRoute * remove unused import * update AUTHORS
This commit is contained in:
parent
f69d125954
commit
464109c0e7
1
AUTHORS
1
AUTHORS
@ -20,3 +20,4 @@ Stefano Rodriguez <hlsroddy@gmail.com>
|
||||
Yusuke Konishi <yahpeycoy0403@gmail.com>
|
||||
Fredrik Simón <fredrik@fsimon.net>
|
||||
Ali Bitek <alibitek@protonmail.ch>
|
||||
Tetsuhiro Ueda <najeira@gmail.com>
|
||||
|
@ -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<AppBar> {
|
||||
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;
|
||||
|
@ -411,7 +411,7 @@ void main() {
|
||||
});
|
||||
|
||||
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 @@ void main() {
|
||||
)
|
||||
);
|
||||
|
||||
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 @@ class _ComputeNotchSetterState extends State<_ComputeNotchSetter> {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user