Fix Backbutton is not displayed when there is a endDrawer (#101869)
This commit is contained in:
@@ -823,9 +823,9 @@ 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 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 bool backwardsCompatibility = widget.backwardsCompatibility ?? appBarTheme.backwardsCompatibility ?? false;
|
||||
|
||||
@@ -896,7 +896,7 @@ class _AppBarState extends State<AppBar> {
|
||||
tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
|
||||
);
|
||||
} else {
|
||||
if (!hasEndDrawer && canPop)
|
||||
if (hasActiveRouteBelow || requiresAppBarDismiss)
|
||||
leading = useCloseButton ? const CloseButton() : const BackButton();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1917,13 +1917,20 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
|
||||
|
||||
/// Whether this scaffold has a non-null [Scaffold.appBar].
|
||||
bool get hasAppBar => widget.appBar != null;
|
||||
|
||||
/// Whether this scaffold has a non-null [Scaffold.drawer].
|
||||
bool get hasDrawer => widget.drawer != null;
|
||||
|
||||
/// Whether this scaffold has a non-null [Scaffold.endDrawer].
|
||||
bool get hasEndDrawer => widget.endDrawer != null;
|
||||
|
||||
/// Whether this scaffold has a non-null [Scaffold.floatingActionButton].
|
||||
bool get hasFloatingActionButton => widget.floatingActionButton != null;
|
||||
|
||||
/// Whether this scaffold requires [Scaffold.appBar] to automatically add
|
||||
/// dismiss button.
|
||||
bool get requiresAppBarDismiss => _persistentSheetHistoryEntry != null;
|
||||
|
||||
double? _appBarMaxHeight;
|
||||
/// The max height the [Scaffold.appBar] uses.
|
||||
///
|
||||
@@ -2051,28 +2058,28 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
|
||||
PersistentBottomSheetController<dynamic>? _currentBottomSheet;
|
||||
final GlobalKey _currentBottomSheetKey = GlobalKey();
|
||||
|
||||
LocalHistoryEntry? _persistentSheetHistoryEntry;
|
||||
void _maybeBuildPersistentBottomSheet() {
|
||||
if (widget.bottomSheet != null && _currentBottomSheet == null) {
|
||||
// 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
|
||||
// support drag or swipe to dismiss.
|
||||
final AnimationController animationController = BottomSheet.createAnimationController(this)..value = 1.0;
|
||||
LocalHistoryEntry? persistentSheetHistoryEntry;
|
||||
bool _persistentBottomSheetExtentChanged(DraggableScrollableNotification notification) {
|
||||
if (notification.extent > notification.initialExtent) {
|
||||
if (persistentSheetHistoryEntry == null) {
|
||||
persistentSheetHistoryEntry = LocalHistoryEntry(onRemove: () {
|
||||
if (_persistentSheetHistoryEntry == null) {
|
||||
_persistentSheetHistoryEntry = LocalHistoryEntry(onRemove: () {
|
||||
if (notification.extent > notification.initialExtent) {
|
||||
DraggableScrollableActuator.reset(notification.context);
|
||||
}
|
||||
showBodyScrim(false, 0.0);
|
||||
_floatingActionButtonVisibilityValue = 1.0;
|
||||
persistentSheetHistoryEntry = null;
|
||||
_persistentSheetHistoryEntry = null;
|
||||
});
|
||||
ModalRoute.of(context)!.addLocalHistoryEntry(persistentSheetHistoryEntry!);
|
||||
ModalRoute.of(context)!.addLocalHistoryEntry(_persistentSheetHistoryEntry!);
|
||||
}
|
||||
} else if (persistentSheetHistoryEntry != null) {
|
||||
ModalRoute.of(context)!.removeLocalHistoryEntry(persistentSheetHistoryEntry!);
|
||||
} else if (_persistentSheetHistoryEntry != null) {
|
||||
ModalRoute.of(context)!.removeLocalHistoryEntry(_persistentSheetHistoryEntry!);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -486,7 +486,6 @@ abstract class Route<T> {
|
||||
}
|
||||
|
||||
/// Whether there is at least one active route underneath this route.
|
||||
@protected
|
||||
bool get hasActiveRouteBelow {
|
||||
if (_navigator == null)
|
||||
return false;
|
||||
|
||||
@@ -2873,6 +2873,44 @@ void main() {
|
||||
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 {
|
||||
await tester.pumpWidget(
|
||||
_buildAppBar(
|
||||
|
||||
Reference in New Issue
Block a user