Unverified Commit e2d12060 authored by chunhtai's avatar chunhtai Committed by GitHub

Fix Backbutton is not displayed when there is a endDrawer (#101869)

parent c165b749
...@@ -823,9 +823,9 @@ class _AppBarState extends State<AppBar> { ...@@ -823,9 +823,9 @@ 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 useCloseButton = parentRoute is PageRoute<dynamic> && parentRoute.fullscreenDialog; final bool useCloseButton = parentRoute is PageRoute<dynamic> && parentRoute.fullscreenDialog;
final bool requiresAppBarDismiss = scaffold?.requiresAppBarDismiss ?? false;
final bool hasActiveRouteBelow = parentRoute?.hasActiveRouteBelow ?? false;
final double toolbarHeight = widget.toolbarHeight ?? appBarTheme.toolbarHeight ?? kToolbarHeight; final double toolbarHeight = widget.toolbarHeight ?? appBarTheme.toolbarHeight ?? kToolbarHeight;
final bool backwardsCompatibility = widget.backwardsCompatibility ?? appBarTheme.backwardsCompatibility ?? false; final bool backwardsCompatibility = widget.backwardsCompatibility ?? appBarTheme.backwardsCompatibility ?? false;
...@@ -896,7 +896,7 @@ class _AppBarState extends State<AppBar> { ...@@ -896,7 +896,7 @@ class _AppBarState extends State<AppBar> {
tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip, tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
); );
} else { } else {
if (!hasEndDrawer && canPop) if (hasActiveRouteBelow || requiresAppBarDismiss)
leading = useCloseButton ? const CloseButton() : const BackButton(); leading = useCloseButton ? const CloseButton() : const BackButton();
} }
} }
......
...@@ -1917,13 +1917,20 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto ...@@ -1917,13 +1917,20 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
/// Whether this scaffold has a non-null [Scaffold.appBar]. /// Whether this scaffold has a non-null [Scaffold.appBar].
bool get hasAppBar => widget.appBar != null; bool get hasAppBar => widget.appBar != null;
/// Whether this scaffold has a non-null [Scaffold.drawer]. /// Whether this scaffold has a non-null [Scaffold.drawer].
bool get hasDrawer => widget.drawer != null; bool get hasDrawer => widget.drawer != null;
/// Whether this scaffold has a non-null [Scaffold.endDrawer]. /// Whether this scaffold has a non-null [Scaffold.endDrawer].
bool get hasEndDrawer => widget.endDrawer != null; bool get hasEndDrawer => widget.endDrawer != null;
/// Whether this scaffold has a non-null [Scaffold.floatingActionButton]. /// Whether this scaffold has a non-null [Scaffold.floatingActionButton].
bool get hasFloatingActionButton => widget.floatingActionButton != null; bool get hasFloatingActionButton => widget.floatingActionButton != null;
/// Whether this scaffold requires [Scaffold.appBar] to automatically add
/// dismiss button.
bool get requiresAppBarDismiss => _persistentSheetHistoryEntry != null;
double? _appBarMaxHeight; double? _appBarMaxHeight;
/// The max height the [Scaffold.appBar] uses. /// The max height the [Scaffold.appBar] uses.
/// ///
...@@ -2051,28 +2058,28 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto ...@@ -2051,28 +2058,28 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
PersistentBottomSheetController<dynamic>? _currentBottomSheet; PersistentBottomSheetController<dynamic>? _currentBottomSheet;
final GlobalKey _currentBottomSheetKey = GlobalKey(); final GlobalKey _currentBottomSheetKey = GlobalKey();
LocalHistoryEntry? _persistentSheetHistoryEntry;
void _maybeBuildPersistentBottomSheet() { void _maybeBuildPersistentBottomSheet() {
if (widget.bottomSheet != null && _currentBottomSheet == null) { if (widget.bottomSheet != null && _currentBottomSheet == null) {
// The new _currentBottomSheet is not a local history entry so a "back" button // The new _currentBottomSheet is not a local history entry so a "back" button
// will not be added to the Scaffold's appbar and the bottom sheet will not // will not be added to the Scaffold's appbar and the bottom sheet will not
// support drag or swipe to dismiss. // support drag or swipe to dismiss.
final AnimationController animationController = BottomSheet.createAnimationController(this)..value = 1.0; final AnimationController animationController = BottomSheet.createAnimationController(this)..value = 1.0;
LocalHistoryEntry? persistentSheetHistoryEntry;
bool _persistentBottomSheetExtentChanged(DraggableScrollableNotification notification) { bool _persistentBottomSheetExtentChanged(DraggableScrollableNotification notification) {
if (notification.extent > notification.initialExtent) { if (notification.extent > notification.initialExtent) {
if (persistentSheetHistoryEntry == null) { if (_persistentSheetHistoryEntry == null) {
persistentSheetHistoryEntry = LocalHistoryEntry(onRemove: () { _persistentSheetHistoryEntry = LocalHistoryEntry(onRemove: () {
if (notification.extent > notification.initialExtent) { if (notification.extent > notification.initialExtent) {
DraggableScrollableActuator.reset(notification.context); DraggableScrollableActuator.reset(notification.context);
} }
showBodyScrim(false, 0.0); showBodyScrim(false, 0.0);
_floatingActionButtonVisibilityValue = 1.0; _floatingActionButtonVisibilityValue = 1.0;
persistentSheetHistoryEntry = null; _persistentSheetHistoryEntry = null;
}); });
ModalRoute.of(context)!.addLocalHistoryEntry(persistentSheetHistoryEntry!); ModalRoute.of(context)!.addLocalHistoryEntry(_persistentSheetHistoryEntry!);
} }
} else if (persistentSheetHistoryEntry != null) { } else if (_persistentSheetHistoryEntry != null) {
ModalRoute.of(context)!.removeLocalHistoryEntry(persistentSheetHistoryEntry!); ModalRoute.of(context)!.removeLocalHistoryEntry(_persistentSheetHistoryEntry!);
} }
return false; return false;
} }
......
...@@ -486,7 +486,6 @@ abstract class Route<T> { ...@@ -486,7 +486,6 @@ abstract class Route<T> {
} }
/// Whether there is at least one active route underneath this route. /// Whether there is at least one active route underneath this route.
@protected
bool get hasActiveRouteBelow { bool get hasActiveRouteBelow {
if (_navigator == null) if (_navigator == null)
return false; return false;
......
...@@ -2873,6 +2873,44 @@ void main() { ...@@ -2873,6 +2873,44 @@ void main() {
expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight);
}); });
// Regression test for https://github.com/flutter/flutter/issues/80256
testWidgets('The second page should have a back button even it has a end drawer', (WidgetTester tester) async {
final Page<void> page1 = MaterialPage<void>(
key: const ValueKey<String>('1'),
child: Scaffold(
key: const ValueKey<String>('1'),
appBar: AppBar(),
endDrawer: const Drawer(),
)
);
final Page<void> page2 = MaterialPage<void>(
key: const ValueKey<String>('2'),
child: Scaffold(
key: const ValueKey<String>('2'),
appBar: AppBar(),
endDrawer: const Drawer(),
)
);
final List<Page<void>> pages = <Page<void>>[ page1, page2 ];
await tester.pumpWidget(
MaterialApp(
home: Navigator(
pages: pages,
onPopPage: (Route<Object?> route, Object? result) => false,
),
),
);
// The page2 should have a back button.
expect(
find.descendant(
of: find.byKey(const ValueKey<String>('2')),
matching: find.byType(BackButton),
),
findsOneWidget
);
});
testWidgets('backgroundColor with FlexibleSpace - reverse', (WidgetTester tester) async { testWidgets('backgroundColor with FlexibleSpace - reverse', (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
_buildAppBar( _buildAppBar(
......
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