fix selection separator

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-07-23 12:35:07 +08:00
parent ad85bc432c
commit d97bfe3f15

View File

@@ -14,15 +14,53 @@ index 97a41dafb8d..70c55832625 100644
context.canvas.drawRect(textBox.toRect().shift(offset), selectionPaint);
}
}
diff --git a/packages/flutter/lib/src/rendering/selection.dart b/packages/flutter/lib/src/rendering/selection.dart
index a813e141dc4..78b9bb84c0e 100644
--- a/packages/flutter/lib/src/rendering/selection.dart
+++ b/packages/flutter/lib/src/rendering/selection.dart
@@ -114,6 +114,8 @@ abstract class SelectionHandler implements ValueListenable<SelectionGeometry> {
/// The length of the content in this object.
int get contentLength;
+
+ Object? get separator;
}
/// This class stores the range information of the selection under a [Selectable]
@@ -236,6 +238,8 @@ class SelectedContent with Diagnosticable {
/// See also:
/// * [SelectableRegion], which provides an overview of selection system.
mixin Selectable implements SelectionHandler {
+ Object? get separator => null;
+
/// {@macro flutter.rendering.RenderObject.getTransformTo}
Matrix4 getTransformTo(RenderObject? ancestor);
diff --git a/packages/flutter/lib/src/widgets/scrollable.dart b/packages/flutter/lib/src/widgets/scrollable.dart
index 9df2d633f16..54d30883245 100644
--- a/packages/flutter/lib/src/widgets/scrollable.dart
+++ b/packages/flutter/lib/src/widgets/scrollable.dart
@@ -1177,6 +1177,9 @@ class _ScrollableSelectionContainerDelegate extends MultiSelectableSelectionCont
_position.addListener(_scheduleLayoutChange);
}
+ @override
+ Object separator = '\n';
+
// Pointer drag is a single point, it should not have a size.
static const double _kDefaultDragTargetSize = 0;
diff --git a/packages/flutter/lib/src/widgets/selectable_region.dart b/packages/flutter/lib/src/widgets/selectable_region.dart
index 59de8bae20b..17220a77d04 100644
index 59de8bae20b..39bfeb2b4f0 100644
--- a/packages/flutter/lib/src/widgets/selectable_region.dart
+++ b/packages/flutter/lib/src/widgets/selectable_region.dart
@@ -402,8 +402,10 @@ class SelectableRegionState extends State<SelectableRegion>
@@ -401,9 +401,11 @@ class SelectableRegionState extends State<SelectableRegion>
final LayerLink _startHandleLayerLink = LayerLink();
final LayerLink _endHandleLayerLink = LayerLink();
final LayerLink _toolbarLayerLink = LayerLink();
final StaticSelectionContainerDelegate _selectionDelegate = StaticSelectionContainerDelegate();
+ StaticSelectionContainerDelegate get selectionDelegate => _selectionDelegate;
- final StaticSelectionContainerDelegate _selectionDelegate = StaticSelectionContainerDelegate();
+ final StaticSelectionContainerDelegate _selectionDelegate = StaticSelectionContainerDelegate(separator: '\n');
+ StaticSelectionContainerDelegate get selectionDelegate => _selectionDelegate;
// there should only ever be one selectable, which is the SelectionContainer.
Selectable? _selectable;
+ Selectable? get selectable => _selectable;
@@ -146,15 +184,48 @@ index 59de8bae20b..17220a77d04 100644
}
},
child: CompositedTransformTarget(
@@ -2822,7 +2796,10 @@ abstract class MultiSelectableSelectionContainerDelegate extends SelectionContai
@@ -2087,6 +2061,11 @@ class _DirectionallyExtendCaretSelectionAction<T extends DirectionalCaretMovemen
/// * [MultiSelectableSelectionContainerDelegate], for the class that provides
/// the main implementation details of this [SelectionContainerDelegate].
class StaticSelectionContainerDelegate extends MultiSelectableSelectionContainerDelegate {
+ StaticSelectionContainerDelegate({this.separator});
+
+ @override
+ final Object? separator;
+
/// The set of [Selectable]s that have received start events.
final Set<Selectable> _hasReceivedStartEvent = <Selectable>{};
@@ -2822,8 +2801,17 @@ abstract class MultiSelectableSelectionContainerDelegate extends SelectionContai
return null;
}
final buffer = StringBuffer();
- for (final selection in selections) {
+ for (final (i, selection) in selections.indexed) {
+ if (i != 0) {
+ buffer.write('\n');
- buffer.write(selection.plainText);
+ if (separator != null) {
+ for (final (i, selection) in selections.indexed) {
+ if (i != 0) {
+ buffer.write(separator);
+ }
+ buffer.write(selection.plainText);
+ }
+ } else {
+ for (final selection in selections) {
+ buffer.write(selection.plainText);
+ }
buffer.write(selection.plainText);
}
return SelectedContent(plainText: buffer.toString());
}
diff --git a/packages/flutter/lib/src/widgets/selection_container.dart b/packages/flutter/lib/src/widgets/selection_container.dart
index 5d5a2386a7a..92e7d1eb70a 100644
--- a/packages/flutter/lib/src/widgets/selection_container.dart
+++ b/packages/flutter/lib/src/widgets/selection_container.dart
@@ -270,6 +270,8 @@ class SelectionRegistrarScope extends InheritedWidget {
/// This delegate needs to implement [SelectionRegistrar] to register
/// [Selectable]s in the [SelectionContainer] subtree.
abstract class SelectionContainerDelegate implements SelectionHandler, SelectionRegistrar {
+ Object? get separator => null;
+
BuildContext? _selectionContainerContext;
/// Gets the paint transform from the [Selectable] child to