import 'package:flutter/material.dart'; void main() { runApp(const BugExample()); } class BugExample extends StatelessWidget { const BugExample(); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( backgroundColor: Colors.grey, body: KeyboardAwareDraggableScrollableSheet( builder: (_, controller) => SingleChildScrollView( controller: controller, child: Container( color: Colors.white, child: Column( children: [ TextField(), Text('one'), Text('two'), Text('three'), Container(width: 50, height: 50, color: Colors.red), Text('four'), Text('five'), Text('six'), Container(width: 50, height: 50, color: Colors.green), Text('seven'), Text('eight'), Text('nine'), Container(width: 50, height: 50, color: Colors.blue), Text('ten'), Text('eleven'), Text('twelve'), ], ), ), ), ), ), ); } } class KeyboardAwareDraggableScrollableSheet extends StatefulWidget { const KeyboardAwareDraggableScrollableSheet({ super.key, required this.builder, }); final ScrollableWidgetBuilder builder; @override State<KeyboardAwareDraggableScrollableSheet> createState() => _KeyboardAwareDraggableScrollableSheetState(); } class _KeyboardAwareDraggableScrollableSheetState extends State<KeyboardAwareDraggableScrollableSheet> { var _virtualKeyboardUp = false; var _previousPosition = 1.0; late DraggableScrollableController _draggableScrollableController; late ScrollController _draggableSheetScrollController; @override void initState() { super.initState(); _draggableScrollableController = DraggableScrollableController(); } void _updateLayoutForVirtualKeyboard( BuildContext context, BoxConstraints constraints, ) { final bottom = MediaQuery.of(context).viewInsets.bottom; final keyboardCurrentlyUp = bottom > 0; if (_virtualKeyboardUp != keyboardCurrentlyUp) { _virtualKeyboardUp = keyboardCurrentlyUp; WidgetsBinding.instance.addPostFrameCallback((_) { late double targetSize; final sheetSize = _draggableScrollableController.isAttached ? _draggableScrollableController.size : 0.5; final scrollPosition = _draggableScrollableController.isAttached ? _draggableSheetScrollController.position.pixels : 0; if (_virtualKeyboardUp) { targetSize = 1.0; _previousPosition = sheetSize; } else if (scrollPosition == 0) { targetSize = _previousPosition; } else { return; } if (_draggableScrollableController.isAttached) { _draggableScrollableController.animateTo( targetSize, duration: const Duration(milliseconds: 200), curve: Curves.easeOut, ); } }); } } @override Widget build(BuildContext context) { return LayoutBuilder( builder: (context, constraints) { _updateLayoutForVirtualKeyboard(context, constraints); return DraggableScrollableSheet( controller: _draggableScrollableController, builder: (context, controller) { _draggableSheetScrollController = controller; final child = widget.builder(context, controller); return Padding( padding: EdgeInsetsDirectional.only( top: MediaQuery.of(context).viewInsets.top, bottom: MediaQuery.of(context).viewInsets.bottom, ), child: child, ); }, ); }, ); } }