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
// bottom sheet.
final List<_StandardBottomSheet> _dismissedBottomSheets = <_StandardBottomSheet>[];
PersistentBottomSheetController<dynamic>? _currentBottomSheet;
final GlobalKey _currentBottomSheetKey = GlobalKey();
void _maybeBuildPersistentBottomSheet() {
if (widget.bottomSheet != null && _currentBottomSheet == null) {
......@@ -2421,7 +2422,10 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
return NotificationListener<DraggableScrollableNotification>(
onNotification: _persistentBottomSheetExtentChanged,
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
}
}
void _updatePersistentBottomSheet() {
_currentBottomSheetKey.currentState!.setState(() {});
}
PersistentBottomSheetController<T> _buildBottomSheet<T>(
WidgetBuilder builder,
bool isPersistent, {
......@@ -2774,8 +2782,13 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
}
return true;
}());
if (widget.bottomSheet == null) {
_closeCurrentBottomSheet();
} else if (widget.bottomSheet != null && oldWidget.bottomSheet == null) {
_maybeBuildPersistentBottomSheet();
} else {
_updatePersistentBottomSheet();
}
}
super.didUpdateWidget(oldWidget);
}
......
......@@ -4,6 +4,7 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
void main() {
// Pumps and ensures that the BottomSheet animates non-linearly.
......@@ -475,6 +476,28 @@ void main() {
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 {
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
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