diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index e2ec6a8914..7e89bf5430 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -959,7 +959,9 @@ class _ScaffoldLayout extends MultiChildLayoutDelegate { final ScaffoldPrelayoutGeometry currentGeometry = ScaffoldPrelayoutGeometry( bottomSheetSize: bottomSheetSize, contentBottom: contentBottom, - contentTop: contentTop, + /// [appBarHeight] should be used instead of [contentTop] because + /// ScaffoldPrelayoutGeometry.contentTop must not be affected by [extendBodyBehindAppBar]. + contentTop: appBarHeight, floatingActionButtonSize: fabSize, minInsets: minInsets, scaffoldSize: size, diff --git a/packages/flutter/test/material/scaffold_test.dart b/packages/flutter/test/material/scaffold_test.dart index 8675a63d1b..439e3c6c25 100644 --- a/packages/flutter/test/material/scaffold_test.dart +++ b/packages/flutter/test/material/scaffold_test.dart @@ -2031,6 +2031,36 @@ void main() { ); await tester.pumpAndSettle(); }); + + testWidgets('FloatingActionButton always keeps the same position regardless of extendBodyBehindAppBar', (WidgetTester tester) async { + await tester.pumpWidget(MaterialApp( + home: Scaffold( + appBar: AppBar(), + floatingActionButton: FloatingActionButton( + onPressed: () {}, + child: const Icon(Icons.add), + ), + floatingActionButtonLocation: FloatingActionButtonLocation.endTop, + extendBodyBehindAppBar: false, + ), + )); + final Offset defaultOffset = tester.getCenter(find.byType(FloatingActionButton)); + + await tester.pumpWidget(MaterialApp( + home: Scaffold( + appBar: AppBar(), + floatingActionButton: FloatingActionButton( + onPressed: () {}, + child: const Icon(Icons.add), + ), + floatingActionButtonLocation: FloatingActionButtonLocation.endTop, + extendBodyBehindAppBar: true, + ), + )); + final Offset extendedBodyOffset = tester.getCenter(find.byType(FloatingActionButton)); + + expect(defaultOffset.dy, extendedBodyOffset.dy); + }); }); testWidgets('ScaffoldMessenger.maybeOf can return null if not found', (WidgetTester tester) async {