From 86aff2a038cd6d892ce8d988c77fa82b4e94baac Mon Sep 17 00:00:00 2001 From: X Code Date: Sun, 30 Jan 2022 01:14:23 -0800 Subject: [PATCH] Fix _handleDragUpdate in _TextSelectionHandleOverlayState --- lib/src/widgets/text_selection.dart | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/src/widgets/text_selection.dart b/lib/src/widgets/text_selection.dart index 3fe0b7af..92f029a3 100644 --- a/lib/src/widgets/text_selection.dart +++ b/lib/src/widgets/text_selection.dart @@ -445,8 +445,9 @@ class _TextSelectionHandleOverlay extends StatefulWidget { class _TextSelectionHandleOverlayState extends State<_TextSelectionHandleOverlay> with SingleTickerProviderStateMixin { + // ignore: unused_field late Offset _dragPosition; - late Size _handleSize; + late AnimationController _controller; Animation get _opacity => _controller.view; @@ -486,12 +487,18 @@ class _TextSelectionHandleOverlayState } void _handleDragStart(DragStartDetails details) { - _dragPosition = details.globalPosition + Offset(0, -_handleSize.height); + final textPosition = widget.position == _TextSelectionHandlePosition.START + ? widget.selection.base + : widget.selection.extent; + final lineHeight = widget.renderObject.preferredLineHeight(textPosition); + final handleSize = widget.selectionControls.getHandleSize(lineHeight); + _dragPosition = details.globalPosition + Offset(0, -handleSize.height); } void _handleDragUpdate(DragUpdateDetails details) { _dragPosition += details.delta; - final position = widget.renderObject.getPositionForOffset(_dragPosition); + final position = + widget.renderObject.getPositionForOffset(details.globalPosition); if (widget.selection.isCollapsed) { widget.onSelectionHandleChanged(TextSelection.fromPosition(position)); return; @@ -499,7 +506,7 @@ class _TextSelectionHandleOverlayState final isNormalized = widget.selection.extentOffset >= widget.selection.baseOffset; - TextSelection? newSelection; + TextSelection newSelection; switch (widget.position) { case _TextSelectionHandlePosition.START: newSelection = TextSelection( @@ -517,6 +524,8 @@ class _TextSelectionHandleOverlayState isNormalized ? position.offset : widget.selection.extentOffset, ); break; + default: + throw 'Invalid widget.position'; } if (newSelection.baseOffset >= newSelection.extentOffset) { @@ -571,7 +580,6 @@ class _TextSelectionHandleOverlayState final handleAnchor = widget.selectionControls.getHandleAnchor(type!, lineHeight); final handleSize = widget.selectionControls.getHandleSize(lineHeight); - _handleSize = handleSize; final handleRect = Rect.fromLTWH( -handleAnchor.dx,