diff --git a/packages/flutter/lib/src/material/selectable_text.dart b/packages/flutter/lib/src/material/selectable_text.dart index b75a3cb9ea..77d5cd8895 100644 --- a/packages/flutter/lib/src/material/selectable_text.dart +++ b/packages/flutter/lib/src/material/selectable_text.dart @@ -183,6 +183,7 @@ class SelectableText extends StatefulWidget { this.cursorHeight, this.cursorRadius, this.cursorColor, + this.selectionColor, this.selectionHeightStyle = ui.BoxHeightStyle.tight, this.selectionWidthStyle = ui.BoxWidthStyle.tight, this.dragStartBehavior = DragStartBehavior.start, @@ -241,6 +242,7 @@ class SelectableText extends StatefulWidget { this.cursorHeight, this.cursorRadius, this.cursorColor, + this.selectionColor, this.selectionHeightStyle = ui.BoxHeightStyle.tight, this.selectionWidthStyle = ui.BoxWidthStyle.tight, this.dragStartBehavior = DragStartBehavior.start, @@ -361,6 +363,15 @@ class SelectableText extends StatefulWidget { /// Otherwise [ColorScheme.primary] of [ThemeData.colorScheme] is used. final Color? cursorColor; + /// The color to use when painting the selection. + /// + /// If this property is null, this widget gets the selection color from the + /// inherited [DefaultSelectionStyle] (if any); if none, the selection + /// color is derived from the [CupertinoThemeData.primaryColor] on + /// Apple platforms and [ColorScheme.primary] of [ThemeData.colorScheme] on + /// other platforms. + final Color? selectionColor; + /// Controls how tall the selection highlight boxes are computed to be. /// /// See [ui.BoxHeightStyle] for details on available styles. @@ -472,6 +483,9 @@ class SelectableText extends StatefulWidget { properties.add(DoubleProperty('cursorHeight', cursorHeight, defaultValue: null)); properties.add(DiagnosticsProperty('cursorRadius', cursorRadius, defaultValue: null)); properties.add(DiagnosticsProperty('cursorColor', cursorColor, defaultValue: null)); + properties.add( + DiagnosticsProperty('selectionColor', selectionColor, defaultValue: null), + ); properties.add( FlagProperty( 'selectionEnabled', @@ -761,7 +775,7 @@ class _SelectableTextState extends State forceLine: false, minLines: widget.minLines, maxLines: widget.maxLines ?? defaultTextStyle.maxLines, - selectionColor: selectionColor, + selectionColor: widget.selectionColor ?? selectionColor, selectionControls: widget.selectionEnabled ? textSelectionControls : null, onSelectionChanged: _handleSelectionChanged, onSelectionHandleTapped: _handleSelectionHandleTapped, diff --git a/packages/flutter/test/widgets/selectable_text_test.dart b/packages/flutter/test/widgets/selectable_text_test.dart index 0ccece18ed..6927dca416 100644 --- a/packages/flutter/test/widgets/selectable_text_test.dart +++ b/packages/flutter/test/widgets/selectable_text_test.dart @@ -423,6 +423,25 @@ void main() { expect(state.widget.cursorColor, cursorColor); }); + testWidgets('Selectable Text can have custom selection color', (WidgetTester tester) async { + const Color selectionColor = Colors.orange; + const Color defaultSelectionColor = Colors.red; + + await tester.pumpWidget( + const MaterialApp( + home: Material( + child: DefaultSelectionStyle( + selectionColor: defaultSelectionColor, + child: SelectableText('text', selectionColor: selectionColor), + ), + ), + ), + ); + await tester.pump(); + final EditableTextState state = tester.state(find.byType(EditableText)); + expect(state.widget.selectionColor, selectionColor); + }); + testWidgets('Selectable Text has adaptive size', (WidgetTester tester) async { await tester.pumpWidget(boilerplate(child: const SelectableText('s')));