pasteText method

  1. @override
Future<void> pasteText(
  1. SelectionChangedCause cause
)
override

Paste text from Clipboard.

Implementation

@override
Future<void> pasteText(SelectionChangedCause cause) async {
  if (widget.readOnly) {
    return;
  }

  if (controller.copiedImageUrl != null) {
    final index = textEditingValue.selection.baseOffset;
    final length = textEditingValue.selection.extentOffset - index;
    final copied = controller.copiedImageUrl!;
    controller.replaceText(index, length, BlockEmbed.image(copied.url), null);
    if (copied.styleString.isNotEmpty) {
      controller.formatText(getEmbedNode(controller, index + 1).offset, 1, StyleAttribute(copied.styleString));
    }
    controller.copiedImageUrl = null;
    await Clipboard.setData(const ClipboardData(text: ''));
    return;
  }

  final selection = textEditingValue.selection;
  if (!selection.isValid) {
    return;
  }
  // Snapshot the input before using `await`.
  // See https://github.com/flutter/flutter/issues/11427
  final text = await Clipboard.getData(Clipboard.kTextPlain);
  if (text != null) {
    _replaceText(ReplaceTextIntent(textEditingValue, text.text!, selection, cause));

    bringIntoView(textEditingValue.selection.extent);

    // Collapse the selection and hide the toolbar and handles.
    userUpdateTextEditingValue(
      TextEditingValue(
        text: textEditingValue.text,
        selection: TextSelection.collapsed(offset: textEditingValue.selection.end),
      ),
      cause,
    );

    return;
  }

  if (widget.onImagePaste != null) {
    final image = await Pasteboard.image;

    if (image == null) {
      return;
    }

    final imageUrl = await widget.onImagePaste!(image);
    if (imageUrl == null) {
      return;
    }

    controller.replaceText(
      textEditingValue.selection.end,
      0,
      BlockEmbed.image(imageUrl),
      null,
    );
  }
}