Unverified Commit 8600eb12 authored by Taha Tesser's avatar Taha Tesser Committed by GitHub

Fix `showBottomSheet` doesn't remove scrim when draggable sheet is dismissed (#128455)

fixes https://github.com/flutter/flutter/issues/128367

<details> 
<summary>code sample</summary> 

```dart
import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(useMaterial3: true),
      home: Scaffold(
        floatingActionButton: Builder(
          builder: (BuildContext context) => FloatingActionButton(
            child: const Icon(Icons.add),
            onPressed: () {
              Scaffold.of(context).showBottomSheet<void>(
                (_) {
                  return DraggableScrollableSheet(
                    expand: false,
                    builder: (_, ScrollController scrollController) =>
                        ListView.builder(
                      controller: scrollController,
                      itemCount: 25,
                      itemBuilder: (BuildContext context, int index) {
                        return ListTile(
                          title: Text('Item $index - tap to close'),
                          onTap: () {
                            Navigator.of(context).pop();
                          },
                        );
                      },
                    ),
                  );
                },
              );
            },
          ),
        ),
      ),
    );
  }
}
``` 
	
</details>

### Before

https://github.com/flutter/flutter/assets/48603081/fa87feb9-54f2-4e50-bf71-c81d9e54ff61

### After 

https://github.com/flutter/flutter/assets/48603081/7d192059-7600-4d65-ae84-6321f3598133
parent 80b9ac2c
...@@ -2312,6 +2312,8 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto ...@@ -2312,6 +2312,8 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
bottomSheetKey.currentState!.close(); bottomSheetKey.currentState!.close();
setState(() { setState(() {
_showBodyScrim = false;
_bodyScrimColor = Colors.black.withOpacity(0.0);
_currentBottomSheet = null; _currentBottomSheet = null;
}); });
......
...@@ -2754,6 +2754,52 @@ void main() { ...@@ -2754,6 +2754,52 @@ void main() {
expect(tester.takeException(), isNull); expect(tester.takeException(), isNull);
}); });
testWidgets('showBottomSheet removes scrim when draggable sheet is dismissed', (WidgetTester tester) async {
final DraggableScrollableController draggableController = DraggableScrollableController();
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();
PersistentBottomSheetController<void>? sheetController;
await tester.pumpWidget(MaterialApp(
home: Scaffold(
key: scaffoldKey,
body: const Center(child: Text('body')),
),
));
sheetController = scaffoldKey.currentState!.showBottomSheet<void>((_) {
return DraggableScrollableSheet(
expand: false,
controller: draggableController,
builder: (BuildContext context, ScrollController scrollController) {
return SingleChildScrollView(
controller: scrollController,
child: const Placeholder(),
);
},
);
});
Finder findModalBarrier() => find.descendant(of: find.byType(Scaffold), matching: find.byType(ModalBarrier));
await tester.pump();
expect(find.byType(BottomSheet), findsOneWidget);
// The scrim is not present yet.
expect(findModalBarrier(), findsNothing);
// Expand the sheet to 80% of parent height to show the scrim.
draggableController.jumpTo(0.8);
await tester.pump();
expect(findModalBarrier(), findsOneWidget);
// Dismiss the sheet.
sheetController.close();
await tester.pumpAndSettle();
// The scrim should be gone.
expect(findModalBarrier(), findsNothing);
});
} }
class _GeometryListener extends StatefulWidget { class _GeometryListener extends StatefulWidget {
......
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