From a56e640e1551334154cdc02b8b3981e7e11326ab Mon Sep 17 00:00:00 2001 From: X Code Date: Wed, 9 Feb 2022 21:06:32 -0800 Subject: [PATCH] Upgrade to flutter 2.10 (#646) * Upgrade to flutter 2.10 * Remove debugAssertLayoutUpToDate * Update copy/paste * Fix analysis error --- lib/src/widgets/editor.dart | 6 -- lib/src/widgets/raw_editor.dart | 140 ++++++++++++++++++++++---------- 2 files changed, 98 insertions(+), 48 deletions(-) diff --git a/lib/src/widgets/editor.dart b/lib/src/widgets/editor.dart index 78a6662b..619bc2bb 100644 --- a/lib/src/widgets/editor.dart +++ b/lib/src/widgets/editor.dart @@ -1549,12 +1549,6 @@ class RenderEditor extends RenderEditableContainerBox super.systemFontsDidChange(); markNeedsLayout(); } - - void debugAssertLayoutUpToDate() { - // no-op? - // this assert was added by Flutter TextEditingActionTarge - // so we have to comply here. - } } class EditableContainerParentData diff --git a/lib/src/widgets/raw_editor.dart b/lib/src/widgets/raw_editor.dart index 4edb77e8..ad0205c6 100644 --- a/lib/src/widgets/raw_editor.dart +++ b/lib/src/widgets/raw_editor.dart @@ -233,7 +233,6 @@ class RawEditorState extends EditorState AutomaticKeepAliveClientMixin, WidgetsBindingObserver, TickerProviderStateMixin, - TextEditingActionTarget, RawEditorStateTextInputClientMixin, RawEditorStateSelectionDelegateMixin { final GlobalKey _editorKey = GlobalKey(); @@ -256,7 +255,6 @@ class RawEditorState extends EditorState // Focus bool _didAutoFocus = false; - FocusAttachment? _focusAttachment; bool get _hasFocus => widget.focusNode.hasFocus; // Theme @@ -280,7 +278,6 @@ class RawEditorState extends EditorState @override Widget build(BuildContext context) { assert(debugCheckHasMediaQuery(context)); - _focusAttachment!.reparent(); super.build(context); var _doc = widget.controller.document; @@ -575,7 +572,7 @@ class RawEditorState extends EditorState }); } - _focusAttachment = widget.focusNode.attach(context); + // Focus widget.focusNode.addListener(_handleFocusChanged); } @@ -619,8 +616,6 @@ class RawEditorState extends EditorState if (widget.focusNode != oldWidget.focusNode) { oldWidget.focusNode.removeListener(_handleFocusChanged); - _focusAttachment?.detach(); - _focusAttachment = widget.focusNode.attach(context); widget.focusNode.addListener(_handleFocusChanged); updateKeepAlive(); } @@ -658,7 +653,6 @@ class RawEditorState extends EditorState _selectionOverlay = null; widget.controller.removeListener(_didChangeTextEditingValue); widget.focusNode.removeListener(_handleFocusChanged); - _focusAttachment!.detach(); _cursorCont.dispose(); _clipboardStatus ..removeListener(_onChangedClipboardStatus) @@ -835,8 +829,15 @@ class RawEditorState extends EditorState /// This property is typically used to notify the renderer of input gestures. @override RenderEditor get renderEditor => - _editorKey.currentContext?.findRenderObject() as RenderEditor; + _editorKey.currentContext!.findRenderObject() as RenderEditor; + /// Express interest in interacting with the keyboard. + /// + /// If this control is already attached to the keyboard, this function will + /// request that the keyboard become visible. Otherwise, this function will + /// ask the focus system that it become focused. If successful in acquiring + /// focus, the control will then attach to the keyboard and request that the + /// keyboard become visible. @override void requestKeyboard() { if (_hasFocus) { @@ -847,24 +848,6 @@ class RawEditorState extends EditorState } } - @override - void setTextEditingValue( - TextEditingValue value, SelectionChangedCause cause) { - if (value == textEditingValue) { - return; - } - textEditingValue = value; - userUpdateTextEditingValue(value, cause); - - // keyboard and text input force a selection completion - _handleSelectionCompleted(); - } - - @override - void debugAssertLayoutUpToDate() { - renderEditor.debugAssertLayoutUpToDate(); - } - /// Shows the selection toolbar at the location of the current cursor. /// /// Returns `false` if a toolbar couldn't be shown, such as when the toolbar @@ -892,8 +875,19 @@ class RawEditorState extends EditorState widget.controller.copiedImageUrl = null; _pastePlainText = widget.controller.getPlainText(); _pasteStyle = widget.controller.getAllIndividualSelectionStyles(); + // Copied straight from EditableTextState - super.copySelection(cause); + void _copySelection(SelectionChangedCause cause) { + final selection = textEditingValue.selection; + final text = textEditingValue.text; + if (selection.isCollapsed || !selection.isValid) { + return; + } + Clipboard.setData(ClipboardData(text: selection.textInside(text))); + } + + _copySelection(cause); + if (cause == SelectionChangedCause.toolbar) { bringIntoView(textEditingValue.selection.extent); hideToolbar(false); @@ -919,7 +913,30 @@ class RawEditorState extends EditorState _pasteStyle = widget.controller.getAllIndividualSelectionStyles(); // Copied straight from EditableTextState - super.cutSelection(cause); + void _cutSelection(SelectionChangedCause cause) { + final selection = textEditingValue.selection; + if (widget.readOnly || !selection.isValid) { + return; + } + final text = textEditingValue.text; + if (selection.isCollapsed) { + return; + } + Clipboard.setData(ClipboardData(text: selection.textInside(text))); + userUpdateTextEditingValue( + TextEditingValue( + text: selection.textBefore(text) + selection.textAfter(text), + selection: TextSelection.collapsed( + offset: math.min(selection.start, selection.end), + affinity: selection.affinity, + ), + ), + cause, + ); + } + + _cutSelection(cause); + if (cause == SelectionChangedCause.toolbar) { bringIntoView(textEditingValue.selection.extent); hideToolbar(); @@ -946,7 +963,37 @@ class RawEditorState extends EditorState } // Copied straight from EditableTextState - super.pasteText(cause); // ignore: unawaited_futures + Future pasteText(SelectionChangedCause cause) async { + final selection = textEditingValue.selection; + if (widget.readOnly || !selection.isValid) { + return; + } + final text = textEditingValue.text; + if (!selection.isValid) { + return; + } + // Snapshot the input before using `await`. + // See https://github.com/flutter/flutter/issues/11427 + final data = await Clipboard.getData(Clipboard.kTextPlain); + if (data == null) { + return; + } + userUpdateTextEditingValue( + TextEditingValue( + text: selection.textBefore(text) + + data.text! + + selection.textAfter(text), + selection: TextSelection.collapsed( + offset: + math.min(selection.start, selection.end) + data.text!.length, + affinity: selection.affinity, + ), + ), + cause, + ); + } + + pasteText(cause); // ignore: unawaited_futures if (cause == SelectionChangedCause.toolbar) { bringIntoView(textEditingValue.selection.extent); @@ -954,10 +1001,31 @@ class RawEditorState extends EditorState } } + void _setSelection(TextSelection nextSelection, SelectionChangedCause cause) { + if (nextSelection == textEditingValue.selection) { + return; + } + userUpdateTextEditingValue( + textEditingValue.copyWith(selection: nextSelection), + cause, + ); + } + @override void selectAll(SelectionChangedCause cause) { // Copied straight from EditableTextState - super.selectAll(cause); + void _selectAll(SelectionChangedCause cause) { + _setSelection( + textEditingValue.selection.copyWith( + baseOffset: 0, + extentOffset: textEditingValue.text.length, + ), + cause, + ); + } + + _selectAll(cause); + if (cause == SelectionChangedCause.toolbar) { bringIntoView(textEditingValue.selection.extent); } @@ -966,18 +1034,6 @@ class RawEditorState extends EditorState @override bool get wantKeepAlive => widget.focusNode.hasFocus; - @override - bool get obscureText => false; - - @override - bool get selectionEnabled => widget.enableInteractiveSelection; - - @override - bool get readOnly => widget.readOnly; - - @override - TextLayoutMetrics get textLayoutMetrics => renderEditor; - @override AnimationController get floatingCursorResetController => _floatingCursorResetController;