Skip to content

Commit

Permalink
fix a Scaffold extendBodyBehindAppBar update bug (#104958)
Browse files Browse the repository at this point in the history
  • Loading branch information
xu-baolin committed Jun 16, 2022
1 parent 512e090 commit ea28f28
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 45 deletions.
4 changes: 0 additions & 4 deletions packages/flutter/lib/src/material/scaffold.dart
Original file line number Diff line number Diff line change
Expand Up @@ -875,10 +875,6 @@ class _BodyBuilder extends StatelessWidget {

@override
Widget build(BuildContext context) {
if (!extendBody && !extendBodyBehindAppBar) {
return body;
}

return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
final _BodyBoxConstraints bodyConstraints = constraints as _BodyBoxConstraints;
Expand Down
35 changes: 35 additions & 0 deletions packages/flutter/test/material/scaffold_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,39 @@ import 'package:flutter_test/flutter_test.dart';
import '../widgets/semantics_tester.dart';

void main() {
// Regression test for https://github.com/flutter/flutter/issues/103741
testWidgets('extendBodyBehindAppBar change should not cause the body widget lose state', (WidgetTester tester) async {
final ScrollController controller = ScrollController();
Widget buildFrame({required bool extendBodyBehindAppBar}) {
return MediaQuery(
data: const MediaQueryData(),
child: Directionality(
textDirection: TextDirection.ltr,
child: Scaffold(
extendBodyBehindAppBar: extendBodyBehindAppBar,
resizeToAvoidBottomInset: false,
body: SingleChildScrollView(
controller: controller,
child: const FlutterLogo(
size: 1107,
),
),
),
),
);
}

await tester.pumpWidget(buildFrame(extendBodyBehindAppBar: true));
expect(controller.position.pixels, 0.0);

controller.jumpTo(100.0);
await tester.pump();
expect(controller.position.pixels, 100.0);

await tester.pumpWidget(buildFrame(extendBodyBehindAppBar: false));
expect(controller.position.pixels, 100.0);
});

testWidgets('Scaffold drawer callback test', (WidgetTester tester) async {
bool isDrawerOpen = false;
bool isEndDrawerOpen = false;
Expand Down Expand Up @@ -2401,6 +2434,8 @@ void main() {
' ancestor was:\n'
' Builder\n'
' The ancestors of this widget were:\n'
' MediaQuery\n'
' LayoutBuilder\n'
' _BodyBuilder\n'
' MediaQuery\n'
' LayoutId-[<_ScaffoldSlot.body>]\n'
Expand Down
20 changes: 8 additions & 12 deletions packages/flutter/test/widgets/interactive_viewer_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1269,11 +1269,9 @@ void main() {
testWidgets('LayoutBuilder is only used for InteractiveViewer.builder', (WidgetTester tester) async {
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: Center(
child: InteractiveViewer(
child: const SizedBox(width: 200.0, height: 200.0),
),
home: Center(
child: InteractiveViewer(
child: const SizedBox(width: 200.0, height: 200.0),
),
),
),
Expand All @@ -1283,13 +1281,11 @@ void main() {

await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: Center(
child: InteractiveViewer.builder(
builder: (BuildContext context, Quad viewport) {
return const SizedBox(width: 200.0, height: 200.0);
},
),
home: Center(
child: InteractiveViewer.builder(
builder: (BuildContext context, Quad viewport) {
return const SizedBox(width: 200.0, height: 200.0);
},
),
),
),
Expand Down
56 changes: 27 additions & 29 deletions packages/flutter/test/widgets/nested_scroll_view_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2360,37 +2360,35 @@ void main() {
testWidgets('NestedScrollView works well when rebuilding during scheduleWarmUpFrame', (WidgetTester tester) async {
bool? isScrolled;
final Widget myApp = MaterialApp(
home: Scaffold(
body: StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return Focus(
onFocusChange: (_) => setState( (){} ),
child: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool boxIsScrolled) {
isScrolled = boxIsScrolled;
return <Widget>[
const SliverAppBar(
expandedHeight: 200,
title: Text('Test'),
),
];
},
body: CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return const Text('');
},
childCount: 10,
),
home: StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return Focus(
onFocusChange: (_) => setState( (){} ),
child: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool boxIsScrolled) {
isScrolled = boxIsScrolled;
return <Widget>[
const SliverAppBar(
expandedHeight: 200,
title: Text('Test'),
),
];
},
body: CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return const Text('');
},
childCount: 10,
),
],
),
),
],
),
);
},
),
),
);
},
),
);

Expand Down

0 comments on commit ea28f28

Please sign in to comment.