From dc4baf459178f1d5f9cda09ce9afe718fa04d546 Mon Sep 17 00:00:00 2001 From: zmtzawqlp Date: Sat, 27 Jul 2019 14:38:48 +0800 Subject: [PATCH] ## [0.4.0] * fix issue about WidgetSpan [https://github.com/fluttercandies/extended_text_field/issues/11] * fix wrong caret offset --- CHANGELOG.md | 5 ++ example/pubspec.lock | 30 +++++----- lib/src/extended_render_editable.dart | 79 +++++++++------------------ lib/src/extended_text_field.dart | 2 - pubspec.lock | 6 +- pubspec.yaml | 2 +- 6 files changed, 50 insertions(+), 74 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d84c15..af08099 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## [0.4.0] + +* fix issue about WidgetSpan [https://github.com/fluttercandies/extended_text_field/issues/11] +* fix wrong caret offset + ## [0.3.9] * improve codes base on v1.7.8 diff --git a/example/pubspec.lock b/example/pubspec.lock index 5fc23e5..999efcf 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -60,37 +60,37 @@ packages: extended_image: dependency: "direct main" description: - path: "E:\\Flutter\\FlutterCandies\\dev\\extended_image" - relative: false - source: path - version: "0.5.2" + name: extended_image + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.5.3" extended_image_library: dependency: transitive description: - path: "E:\\Flutter\\FlutterCandies\\dev\\extended_image_library" - relative: false - source: path + name: extended_image_library + url: "https://pub.flutter-io.cn" + source: hosted version: "0.1.4" extended_text: dependency: "direct main" description: - path: "E:\\Flutter\\FlutterCandies\\dev\\extended_text" - relative: false - source: path - version: "0.5.9" + name: extended_text + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.6.1" extended_text_field: dependency: "direct main" description: path: ".." relative: true source: path - version: "0.3.8" + version: "0.3.9" extended_text_library: dependency: transitive description: - path: "E:\\Flutter\\FlutterCandies\\dev\\extended_text_library" - relative: false - source: path + name: extended_text_library + url: "https://pub.flutter-io.cn" + source: hosted version: "0.4.2" flutter: dependency: "direct main" diff --git a/lib/src/extended_render_editable.dart b/lib/src/extended_render_editable.dart index 1b1d7f8..9e4c02c 100644 --- a/lib/src/extended_render_editable.dart +++ b/lib/src/extended_render_editable.dart @@ -281,10 +281,12 @@ class ExtendedRenderEditable extends RenderBox final Rect visibleRegion = Offset(0.0, _visibleRegionMinY) & size; - final Offset startOffset = _textPainter.getOffsetForCaret( - TextPosition(offset: selection.start, affinity: selection.affinity), - Rect.zero, - ); + final Offset startOffset = _getCaretOffset( + TextPosition( + offset: selection.start, + affinity: selection.affinity, + ), + effectiveOffset: effectiveOffset); // TODO(justinmc): https://github.com/flutter/flutter/issues/31495 // Check if the selection is visible with an approximation because a @@ -298,23 +300,9 @@ class ExtendedRenderEditable extends RenderBox .inflate(visibleRegionSlop) .contains(startOffset + effectiveOffset); - Offset endOffset = _textPainter.getOffsetForCaret( - TextPosition(offset: selection.end, affinity: selection.affinity), - Rect.zero, - ); - - if (handleSpecialText && - selection.end > 0 && - endOffset == Offset.zero && - effectiveOffset == Offset.zero) { - var boxs = _textPainter.getBoxesForSelection(TextSelection( - baseOffset: selection.end - 1, - extentOffset: selection.end, - affinity: selection.affinity)); - if (boxs.length > 0) { - endOffset = boxs.toList().last.toRect().topRight; - } - } + final Offset endOffset = _getCaretOffset( + TextPosition(offset: selection.end, affinity: selection.affinity), + effectiveOffset: effectiveOffset); _selectionEndInViewport.value = visibleRegion .inflate(visibleRegionSlop) @@ -1181,8 +1169,7 @@ class ExtendedRenderEditable extends RenderBox //final Offset paintOffset = _paintOffset; ///zmt - final Offset effectiveOffset = - (_initialOffset ?? Offset.zero) + _paintOffset; + final Offset effectiveOffset = _effectiveOffset; TextSelection textPainterSelection = selection; if (handleSpecialText) { @@ -1197,13 +1184,11 @@ class ExtendedRenderEditable extends RenderBox caretHeight = value; }; final Offset caretOffset = _getCaretOffset( - effectiveOffset, TextPosition( offset: textPainterSelection.extentOffset, affinity: selection.affinity), - TextPosition( - offset: selection.extentOffset, affinity: selection.affinity), - caretHeightCallBack: caretHeightCallBack); + caretHeightCallBack: caretHeightCallBack, + effectiveOffset: effectiveOffset); final Offset start = Offset(0.0, caretHeight ?? preferredLineHeight) + caretOffset; @@ -1659,9 +1644,9 @@ class ExtendedRenderEditable extends RenderBox ValueChanged caretHeightCallBack = (value) { caretHeight = value; }; - final Offset caretOffset = _getCaretOffset( - effectiveOffset, textPosition, textInputPosition, - caretHeightCallBack: caretHeightCallBack); + final Offset caretOffset = _getCaretOffset(textPosition, + caretHeightCallBack: caretHeightCallBack, + effectiveOffset: effectiveOffset); Rect caretRect = _caretPrototype.shift(caretOffset); if (_cursorOffset != null) caretRect = caretRect.shift(_cursorOffset); @@ -1718,28 +1703,12 @@ class ExtendedRenderEditable extends RenderBox } } - Offset _getCaretOffset(Offset effectiveOffset, TextPosition textPosition, - TextPosition textInputPosition, - {ValueChanged caretHeightCallBack}) { + Offset _getCaretOffset(TextPosition textPosition, + {ValueChanged caretHeightCallBack, Offset effectiveOffset}) { + effectiveOffset ??= this._effectiveOffset; + ///zmt if (handleSpecialText) { - var textSpan = text.getSpanForPosition(TextPosition( - offset: textPosition.offset, affinity: TextAffinity.upstream)); - if (textSpan != null && textSpan is ExtendedWidgetSpan) { - int index = _placeholderSpans.indexOf(textSpan); - if (index >= 0 && index < _textPainter.inlinePlaceholderBoxes.length) { - var box = _textPainter.inlinePlaceholderBoxes[index]; - var rect = box.toRect(); - if (textInputPosition.offset >= textSpan.end) { - caretHeightCallBack?.call(rect.height); - return rect.topRight; - } else if (textInputPosition.offset >= textSpan.start) { - caretHeightCallBack?.call(rect.height); - return rect.topLeft; - } - } - } - ///if first index, check by first span var offset = textPosition.offset; if (offset == 0) { @@ -1747,6 +1716,7 @@ class ExtendedRenderEditable extends RenderBox } ///last or has ExtendedWidgetSpan + var boxs = _textPainter.getBoxesForSelection(TextSelection( baseOffset: offset - 1, extentOffset: offset, @@ -1755,9 +1725,9 @@ class ExtendedRenderEditable extends RenderBox var rect = boxs.toList().last.toRect(); caretHeightCallBack?.call(rect.height); if (textPosition.offset == 0) { - return rect.topLeft; + return rect.topLeft + effectiveOffset; } else { - return rect.topRight; + return rect.topRight + effectiveOffset; } } } @@ -1932,7 +1902,7 @@ class ExtendedRenderEditable extends RenderBox final double scale = textParentData.scale; context.pushTransform( needsCompositing, - offset + textParentData.offset, + effectiveOffset + textParentData.offset, Matrix4.diagonal3Values(scale, scale, scale), (PaintingContext context, Offset offset) { context.paintChild( @@ -1983,10 +1953,13 @@ class ExtendedRenderEditable extends RenderBox } Offset _initialOffset; + Offset get _effectiveOffset => (_initialOffset ?? Offset.zero) + _paintOffset; + @override void paint(PaintingContext context, Offset offset) { ///zmt _initialOffset = offset; + _layoutText(constraints.maxWidth); if (_hasVisualOverflow) context.pushClipRect( diff --git a/lib/src/extended_text_field.dart b/lib/src/extended_text_field.dart index 000a066..207863b 100644 --- a/lib/src/extended_text_field.dart +++ b/lib/src/extended_text_field.dart @@ -14,8 +14,6 @@ import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'extended_text_selection.dart'; - /// Signature for the [ExtendedTextField.buildCounter] callback. typedef InputCounterWidgetBuilder = Widget Function( /// The build context for the TextField diff --git a/pubspec.lock b/pubspec.lock index 4a8bbfb..5565e84 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -32,9 +32,9 @@ packages: extended_text_library: dependency: "direct main" description: - path: "E:\\Flutter\\FlutterCandies\\dev\\extended_text_library" - relative: false - source: path + name: extended_text_library + url: "https://pub.flutter-io.cn" + source: hosted version: "0.4.2" flutter: dependency: "direct main" diff --git a/pubspec.yaml b/pubspec.yaml index b13822c..0644ba8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: extended_text_field description: extended official text field to quickly build special text like inline image, @somebody, custom background etc. -version: 0.3.9 +version: 0.4.0 author: zmtzawqlp homepage: https://github.com/fluttercandies/extended_text_field