diff --git a/lib/scripts/selectable_region.patch b/lib/scripts/selectable_region.patch index 3bea63f28..e666302af 100644 --- a/lib/scripts/selectable_region.patch +++ b/lib/scripts/selectable_region.patch @@ -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 { + + /// 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 +@@ -401,9 +401,11 @@ class SelectableRegionState extends State + 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 _hasReceivedStartEvent = {}; + +@@ -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