Unverified Commit 3b2044ab authored by xubaolin's avatar xubaolin Committed by GitHub

Improve the Scaffold.bottomSheet update behavior (#73084)

parent a706cd21
...@@ -2389,6 +2389,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto ...@@ -2389,6 +2389,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
// bottom sheet. // bottom sheet.
final List<_StandardBottomSheet> _dismissedBottomSheets = <_StandardBottomSheet>[]; final List<_StandardBottomSheet> _dismissedBottomSheets = <_StandardBottomSheet>[];
PersistentBottomSheetController<dynamic>? _currentBottomSheet; PersistentBottomSheetController<dynamic>? _currentBottomSheet;
final GlobalKey _currentBottomSheetKey = GlobalKey();
void _maybeBuildPersistentBottomSheet() { void _maybeBuildPersistentBottomSheet() {
if (widget.bottomSheet != null && _currentBottomSheet == null) { if (widget.bottomSheet != null && _currentBottomSheet == null) {
...@@ -2421,7 +2422,10 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto ...@@ -2421,7 +2422,10 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
return NotificationListener<DraggableScrollableNotification>( return NotificationListener<DraggableScrollableNotification>(
onNotification: _persistentBottomSheetExtentChanged, onNotification: _persistentBottomSheetExtentChanged,
child: DraggableScrollableActuator( child: DraggableScrollableActuator(
child: widget.bottomSheet!, child: StatefulBuilder(
key: _currentBottomSheetKey,
builder: (BuildContext context, StateSetter setState) => widget.bottomSheet!,
),
), ),
); );
}, },
...@@ -2445,6 +2449,10 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto ...@@ -2445,6 +2449,10 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
} }
} }
void _updatePersistentBottomSheet() {
_currentBottomSheetKey.currentState!.setState(() {});
}
PersistentBottomSheetController<T> _buildBottomSheet<T>( PersistentBottomSheetController<T> _buildBottomSheet<T>(
WidgetBuilder builder, WidgetBuilder builder,
bool isPersistent, { bool isPersistent, {
...@@ -2774,8 +2782,13 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto ...@@ -2774,8 +2782,13 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
} }
return true; return true;
}()); }());
_closeCurrentBottomSheet(); if (widget.bottomSheet == null) {
_maybeBuildPersistentBottomSheet(); _closeCurrentBottomSheet();
} else if (widget.bottomSheet != null && oldWidget.bottomSheet == null) {
_maybeBuildPersistentBottomSheet();
} else {
_updatePersistentBottomSheet();
}
} }
super.didUpdateWidget(oldWidget); super.didUpdateWidget(oldWidget);
} }
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
void main() { void main() {
// Pumps and ensures that the BottomSheet animates non-linearly. // Pumps and ensures that the BottomSheet animates non-linearly.
...@@ -475,6 +476,28 @@ void main() { ...@@ -475,6 +476,28 @@ void main() {
expect(find.byKey(bottomSheetKey), findsNothing); expect(find.byKey(bottomSheetKey), findsNothing);
}); });
// Regression test for https://github.com/flutter/flutter/issues/71435
testWidgets('Scaffold.bottomSheet should be updated without creating a new RO'
' when the new widget has the same key and type.', (WidgetTester tester) async {
Widget buildFrame(String text) {
return MaterialApp(
home: Scaffold(
body: const Placeholder(),
bottomSheet: Text(text),
),
);
}
await tester.pumpWidget(buildFrame('I love Flutter!'));
final RenderParagraph renderBeforeUpdate = tester.renderObject(find.text('I love Flutter!'));
await tester.pumpWidget(buildFrame('Flutter is the best!'));
await tester.pumpAndSettle();
final RenderParagraph renderAfterUpdate = tester.renderObject(find.text('Flutter is the best!'));
expect(renderBeforeUpdate, renderAfterUpdate);
});
testWidgets('Verify that visual properties are passed through', (WidgetTester tester) async { testWidgets('Verify that visual properties are passed through', (WidgetTester tester) async {
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
const Color color = Colors.pink; const Color color = Colors.pink;
......
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