Unverified Commit ea28f287 authored by xubaolin's avatar xubaolin Committed by GitHub

fix a Scaffold extendBodyBehindAppBar update bug (#104958)

parent 512e090d
...@@ -875,10 +875,6 @@ class _BodyBuilder extends StatelessWidget { ...@@ -875,10 +875,6 @@ class _BodyBuilder extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (!extendBody && !extendBodyBehindAppBar) {
return body;
}
return LayoutBuilder( return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) { builder: (BuildContext context, BoxConstraints constraints) {
final _BodyBoxConstraints bodyConstraints = constraints as _BodyBoxConstraints; final _BodyBoxConstraints bodyConstraints = constraints as _BodyBoxConstraints;
......
...@@ -11,6 +11,39 @@ import 'package:flutter_test/flutter_test.dart'; ...@@ -11,6 +11,39 @@ import 'package:flutter_test/flutter_test.dart';
import '../widgets/semantics_tester.dart'; import '../widgets/semantics_tester.dart';
void main() { 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 { testWidgets('Scaffold drawer callback test', (WidgetTester tester) async {
bool isDrawerOpen = false; bool isDrawerOpen = false;
bool isEndDrawerOpen = false; bool isEndDrawerOpen = false;
...@@ -2401,6 +2434,8 @@ void main() { ...@@ -2401,6 +2434,8 @@ void main() {
' ancestor was:\n' ' ancestor was:\n'
' Builder\n' ' Builder\n'
' The ancestors of this widget were:\n' ' The ancestors of this widget were:\n'
' MediaQuery\n'
' LayoutBuilder\n'
' _BodyBuilder\n' ' _BodyBuilder\n'
' MediaQuery\n' ' MediaQuery\n'
' LayoutId-[<_ScaffoldSlot.body>]\n' ' LayoutId-[<_ScaffoldSlot.body>]\n'
......
...@@ -1269,11 +1269,9 @@ void main() { ...@@ -1269,11 +1269,9 @@ void main() {
testWidgets('LayoutBuilder is only used for InteractiveViewer.builder', (WidgetTester tester) async { testWidgets('LayoutBuilder is only used for InteractiveViewer.builder', (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
home: Scaffold( home: Center(
body: Center( child: InteractiveViewer(
child: InteractiveViewer( child: const SizedBox(width: 200.0, height: 200.0),
child: const SizedBox(width: 200.0, height: 200.0),
),
), ),
), ),
), ),
...@@ -1283,13 +1281,11 @@ void main() { ...@@ -1283,13 +1281,11 @@ void main() {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
home: Scaffold( home: Center(
body: Center( child: InteractiveViewer.builder(
child: InteractiveViewer.builder( builder: (BuildContext context, Quad viewport) {
builder: (BuildContext context, Quad viewport) { return const SizedBox(width: 200.0, height: 200.0);
return const SizedBox(width: 200.0, height: 200.0); },
},
),
), ),
), ),
), ),
......
...@@ -2360,37 +2360,35 @@ void main() { ...@@ -2360,37 +2360,35 @@ void main() {
testWidgets('NestedScrollView works well when rebuilding during scheduleWarmUpFrame', (WidgetTester tester) async { testWidgets('NestedScrollView works well when rebuilding during scheduleWarmUpFrame', (WidgetTester tester) async {
bool? isScrolled; bool? isScrolled;
final Widget myApp = MaterialApp( final Widget myApp = MaterialApp(
home: Scaffold( home: StatefulBuilder(
body: StatefulBuilder( builder: (BuildContext context, StateSetter setState) {
builder: (BuildContext context, StateSetter setState) { return Focus(
return Focus( onFocusChange: (_) => setState( (){} ),
onFocusChange: (_) => setState( (){} ), child: NestedScrollView(
child: NestedScrollView( headerSliverBuilder: (BuildContext context, bool boxIsScrolled) {
headerSliverBuilder: (BuildContext context, bool boxIsScrolled) { isScrolled = boxIsScrolled;
isScrolled = boxIsScrolled; return <Widget>[
return <Widget>[ const SliverAppBar(
const SliverAppBar( expandedHeight: 200,
expandedHeight: 200, title: Text('Test'),
title: Text('Test'), ),
), ];
]; },
}, body: CustomScrollView(
body: CustomScrollView( slivers: <Widget>[
slivers: <Widget>[ SliverList(
SliverList( delegate: SliverChildBuilderDelegate(
delegate: SliverChildBuilderDelegate( (BuildContext context, int index) {
(BuildContext context, int index) { return const Text('');
return const Text(''); },
}, childCount: 10,
childCount: 10,
),
), ),
], ),
), ],
), ),
); ),
}, );
), },
), ),
); );
......
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