From ea28f287f1280261e8e9a0d5b1abea76a26e6405 Mon Sep 17 00:00:00 2001 From: xubaolin Date: Thu, 16 Jun 2022 09:33:06 +0800 Subject: [PATCH] fix a Scaffold extendBodyBehindAppBar update bug (#104958) --- .../flutter/lib/src/material/scaffold.dart | 4 -- .../flutter/test/material/scaffold_test.dart | 35 ++++++++++++ .../test/widgets/interactive_viewer_test.dart | 20 +++---- .../test/widgets/nested_scroll_view_test.dart | 56 +++++++++---------- 4 files changed, 70 insertions(+), 45 deletions(-) diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index a18184bd3b0e..5d02f47eebea 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -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; diff --git a/packages/flutter/test/material/scaffold_test.dart b/packages/flutter/test/material/scaffold_test.dart index 219fdf00996f..888fa22c277a 100644 --- a/packages/flutter/test/material/scaffold_test.dart +++ b/packages/flutter/test/material/scaffold_test.dart @@ -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; @@ -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' diff --git a/packages/flutter/test/widgets/interactive_viewer_test.dart b/packages/flutter/test/widgets/interactive_viewer_test.dart index 6834c56423b3..a005d9196ad6 100644 --- a/packages/flutter/test/widgets/interactive_viewer_test.dart +++ b/packages/flutter/test/widgets/interactive_viewer_test.dart @@ -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), ), ), ), @@ -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); + }, ), ), ), diff --git a/packages/flutter/test/widgets/nested_scroll_view_test.dart b/packages/flutter/test/widgets/nested_scroll_view_test.dart index af4af7a3fafa..7f54f766f523 100644 --- a/packages/flutter/test/widgets/nested_scroll_view_test.dart +++ b/packages/flutter/test/widgets/nested_scroll_view_test.dart @@ -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 [ - const SliverAppBar( - expandedHeight: 200, - title: Text('Test'), - ), - ]; - }, - body: CustomScrollView( - slivers: [ - 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 [ + const SliverAppBar( + expandedHeight: 200, + title: Text('Test'), + ), + ]; + }, + body: CustomScrollView( + slivers: [ + SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return const Text(''); + }, + childCount: 10, ), - ], - ), + ), + ], ), - ); - }, - ), + ), + ); + }, ), );