Fix _handleDragUpdate in _TextSelectionHandleOverlayState

pull/630/head
X Code 3 years ago
parent f007354970
commit 86aff2a038
  1. 18
      lib/src/widgets/text_selection.dart

@ -445,8 +445,9 @@ class _TextSelectionHandleOverlay extends StatefulWidget {
class _TextSelectionHandleOverlayState class _TextSelectionHandleOverlayState
extends State<_TextSelectionHandleOverlay> extends State<_TextSelectionHandleOverlay>
with SingleTickerProviderStateMixin { with SingleTickerProviderStateMixin {
// ignore: unused_field
late Offset _dragPosition; late Offset _dragPosition;
late Size _handleSize;
late AnimationController _controller; late AnimationController _controller;
Animation<double> get _opacity => _controller.view; Animation<double> get _opacity => _controller.view;
@ -486,12 +487,18 @@ class _TextSelectionHandleOverlayState
} }
void _handleDragStart(DragStartDetails details) { 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) { void _handleDragUpdate(DragUpdateDetails details) {
_dragPosition += details.delta; _dragPosition += details.delta;
final position = widget.renderObject.getPositionForOffset(_dragPosition); final position =
widget.renderObject.getPositionForOffset(details.globalPosition);
if (widget.selection.isCollapsed) { if (widget.selection.isCollapsed) {
widget.onSelectionHandleChanged(TextSelection.fromPosition(position)); widget.onSelectionHandleChanged(TextSelection.fromPosition(position));
return; return;
@ -499,7 +506,7 @@ class _TextSelectionHandleOverlayState
final isNormalized = final isNormalized =
widget.selection.extentOffset >= widget.selection.baseOffset; widget.selection.extentOffset >= widget.selection.baseOffset;
TextSelection? newSelection; TextSelection newSelection;
switch (widget.position) { switch (widget.position) {
case _TextSelectionHandlePosition.START: case _TextSelectionHandlePosition.START:
newSelection = TextSelection( newSelection = TextSelection(
@ -517,6 +524,8 @@ class _TextSelectionHandleOverlayState
isNormalized ? position.offset : widget.selection.extentOffset, isNormalized ? position.offset : widget.selection.extentOffset,
); );
break; break;
default:
throw 'Invalid widget.position';
} }
if (newSelection.baseOffset >= newSelection.extentOffset) { if (newSelection.baseOffset >= newSelection.extentOffset) {
@ -571,7 +580,6 @@ class _TextSelectionHandleOverlayState
final handleAnchor = final handleAnchor =
widget.selectionControls.getHandleAnchor(type!, lineHeight); widget.selectionControls.getHandleAnchor(type!, lineHeight);
final handleSize = widget.selectionControls.getHandleSize(lineHeight); final handleSize = widget.selectionControls.getHandleSize(lineHeight);
_handleSize = handleSize;
final handleRect = Rect.fromLTWH( final handleRect = Rect.fromLTWH(
-handleAnchor.dx, -handleAnchor.dx,

Loading…
Cancel
Save