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,
                  );
          },
        );
      },
    );
  }
}