diff --git a/packages/devtools_app/lib/src/framework/scaffold/about_dialog.dart b/packages/devtools_app/lib/src/framework/scaffold/about_dialog.dart index cc0fb5a8b2a..2a31c09ed53 100644 --- a/packages/devtools_app/lib/src/framework/scaffold/about_dialog.dart +++ b/packages/devtools_app/lib/src/framework/scaffold/about_dialog.dart @@ -24,42 +24,50 @@ class DevToolsAboutDialog extends StatelessWidget { final theme = Theme.of(context); return DevToolsDialog( title: const DialogTitleText('About DevTools'), - content: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Wrap( - children: [ - SelectableText('DevTools version $devToolsVersion'), - const Text(' - '), - InkWell( - child: Text('release notes', style: theme.linkTextStyle), - onTap: () => - unawaited(releaseNotesController.openLatestReleaseNotes()), - ), - ], - ), - const SizedBox(height: denseSpacing), - const Wrap( - children: [ - Text('Encountered an issue? Let us know at '), - _FeedbackLink(), - Text('.'), - ], - ), - const SizedBox(height: defaultSpacing), - ...dialogSubHeader(theme, 'Contributing'), - const Wrap( - children: [ - Text('Want to contribute to DevTools? Please see our '), - _ContributingLink(), - Text(' guide, or '), - ], - ), - const Wrap( - children: [Text('connect with us on '), _DiscordLink(), Text('.')], - ), - ], + content: SelectionArea( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Wrap( + children: [ + Text('DevTools version $devToolsVersion'), + const Text(' - '), + InkWell( + child: Text('release notes', style: theme.linkTextStyle), + onTap: () => unawaited( + releaseNotesController.openLatestReleaseNotes(), + ), + ), + ], + ), + const SizedBox(height: denseSpacing), + const Wrap( + children: [ + Text('Encountered an issue? Let us know at '), + _FeedbackLink(), + Text('.'), + ], + ), + const SizedBox(height: defaultSpacing), + ...dialogSubHeader(theme, 'Contributing'), + const Wrap( + children: [ + Text('Want to contribute to DevTools? Please see our '), + _ContributingLink(), + Text(' guide, or '), + ], + ), + + const Wrap( + children: [ + Text('connect with us on '), + _DiscordLink(), + Text('.'), + ], + ), + ], + ), ), actions: const [DialogLicenseButton(), DialogCloseButton()], ); diff --git a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_model.dart b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_model.dart index 9eaf19a6f1f..0e923c02a4c 100644 --- a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_model.dart +++ b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_links_model.dart @@ -586,7 +586,6 @@ class DomainColumn extends ColumnData LinkData dataObject, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return dataObject.domain == null ? Text('missing domain', style: Theme.of(context).errorTextStyle) @@ -648,7 +647,6 @@ class PathColumn extends ColumnData LinkData dataObject, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return _ErrorAwareText( isError: dataObject.pathErrors.isNotEmpty, @@ -728,7 +726,6 @@ class SchemeColumn extends ColumnData LinkData dataObject, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return dataObject.scheme.isEmpty ? Text(missingScheme, style: Theme.of(context).errorTextStyle) @@ -780,7 +777,6 @@ class OSColumn extends ColumnData LinkData dataObject, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return Text(getValue(dataObject)); } @@ -853,7 +849,6 @@ class StatusColumn extends ColumnData LinkData dataObject, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { if (dataObject.domainErrors.isNotEmpty || dataObject.pathErrors.isNotEmpty) { @@ -888,7 +883,6 @@ class NavigationColumn extends ColumnData LinkData dataObject, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return isRowHovered ? const Icon(Icons.arrow_forward) diff --git a/packages/devtools_app/lib/src/screens/logging/_log_details.dart b/packages/devtools_app/lib/src/screens/logging/_log_details.dart index e32a9015829..977af418050 100644 --- a/packages/devtools_app/lib/src/screens/logging/_log_details.dart +++ b/packages/devtools_app/lib/src/screens/logging/_log_details.dart @@ -92,9 +92,11 @@ class _LogDetailsState extends State (log?.encodedDetails ?? '').isEmpty ? Padding( padding: const EdgeInsets.all(denseSpacing), - child: SelectableText( - log?.prettyPrinted() ?? '', - textAlign: TextAlign.left, + child: SelectionArea( + child: Text( + log?.prettyPrinted() ?? '', + textAlign: TextAlign.left, + ), ), ) : JsonViewer(encodedJson: log!.encodedDetails), diff --git a/packages/devtools_app/lib/src/screens/logging/_message_column.dart b/packages/devtools_app/lib/src/screens/logging/_message_column.dart index 51277b29c4a..e950108fc9b 100644 --- a/packages/devtools_app/lib/src/screens/logging/_message_column.dart +++ b/packages/devtools_app/lib/src/screens/logging/_message_column.dart @@ -48,7 +48,6 @@ class MessageColumn extends ColumnData LogData data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { final theme = Theme.of(context); final hasSummary = !data.summary.isNullOrEmpty; diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_diff.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_diff.dart index f2d4db239d6..3ff55dcbfe9 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_diff.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_diff.dart @@ -48,7 +48,6 @@ class _ClassNameColumn extends ColumnData DiffClassData data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return HeapClassView( theClass: data.className, @@ -132,7 +131,6 @@ class _InstanceColumn extends ColumnData DiffClassData data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { final objects = _instances(data); diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_single.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_single.dart index fd1828555ef..1519a31e6ae 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_single.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/classes_table_single.dart @@ -45,7 +45,6 @@ class _ClassNameColumn extends ColumnData SingleClassData data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return HeapClassView( theClass: data.className, @@ -94,7 +93,6 @@ class _InstanceColumn extends ColumnData SingleClassData data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return HeapInstanceTableCell( data.objects, diff --git a/packages/devtools_app/lib/src/screens/memory/panes/profile/profile_view.dart b/packages/devtools_app/lib/src/screens/memory/panes/profile/profile_view.dart index b8ff82de810..24fd3e0fb9e 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/profile/profile_view.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/profile/profile_view.dart @@ -54,7 +54,6 @@ class _FieldClassNameColumn extends ColumnData ProfileRecord data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { if (data.isTotal) return null; @@ -134,7 +133,6 @@ class _FieldInstanceCountColumn extends ColumnData ProfileRecord data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return ProfileInstanceTableCell( data.heapClass, diff --git a/packages/devtools_app/lib/src/screens/memory/panes/tracing/class_table.dart b/packages/devtools_app/lib/src/screens/memory/panes/tracing/class_table.dart index 136e2249bde..b05f4229956 100644 --- a/packages/devtools_app/lib/src/screens/memory/panes/tracing/class_table.dart +++ b/packages/devtools_app/lib/src/screens/memory/panes/tracing/class_table.dart @@ -42,7 +42,6 @@ class _TraceCheckBoxColumn extends ColumnData TracedClass item, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return Checkbox( value: item.traceAllocations, @@ -86,7 +85,6 @@ class _ClassNameColumn extends ColumnData TracedClass data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return HeapClassView( theClass: data.name, diff --git a/packages/devtools_app/lib/src/screens/network/network_screen.dart b/packages/devtools_app/lib/src/screens/network/network_screen.dart index 254f49d229e..491d355ade6 100644 --- a/packages/devtools_app/lib/src/screens/network/network_screen.dart +++ b/packages/devtools_app/lib/src/screens/network/network_screen.dart @@ -379,18 +379,12 @@ class AddressColumn extends ColumnData NetworkRequest data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { final value = getDisplayValue(data); - - return SelectableText( + return Text( value, maxLines: 1, style: const TextStyle(overflow: TextOverflow.ellipsis), - // [onPressed] needs to be passed along to [SelectableText] so that a - // click on the text will still trigger the [onPressed] action for the - // row. - onTap: onPressed, ); } } @@ -426,7 +420,6 @@ class ActionsColumn extends ColumnData NetworkRequest data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { // Only show the actions button when there are options and the row is // currently selected. @@ -489,7 +482,6 @@ class StatusColumn extends ColumnData NetworkRequest data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { final theme = Theme.of(context); return Text( diff --git a/packages/devtools_app/lib/src/screens/profiler/panes/cpu_profile_columns.dart b/packages/devtools_app/lib/src/screens/profiler/panes/cpu_profile_columns.dart index 9bd4d524a45..9d2fe22609b 100644 --- a/packages/devtools_app/lib/src/screens/profiler/panes/cpu_profile_columns.dart +++ b/packages/devtools_app/lib/src/screens/profiler/panes/cpu_profile_columns.dart @@ -58,7 +58,6 @@ class MethodAndSourceColumn extends TreeColumnData CpuStackFrame data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return MethodAndSourceDisplay( methodName: data.name, diff --git a/packages/devtools_app/lib/src/screens/profiler/panes/method_table/method_table.dart b/packages/devtools_app/lib/src/screens/profiler/panes/method_table/method_table.dart index 3963ad6bcef..917e472411e 100644 --- a/packages/devtools_app/lib/src/screens/profiler/panes/method_table/method_table.dart +++ b/packages/devtools_app/lib/src/screens/profiler/panes/method_table/method_table.dart @@ -262,7 +262,6 @@ class _MethodColumn extends ColumnData MethodTableGraphNode data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return MethodAndSourceDisplay( methodName: data.name, diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/object_store.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/object_store.dart index 736b94fb104..91a67ce491f 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/object_store.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/object_store.dart @@ -49,7 +49,6 @@ class _ObjectColumn extends ColumnData dynamic data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return VmServiceObjectLink( // TODO(srawlins): What type is `data` at runtime? If cast to `int`, no diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_code_display.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_code_display.dart index 52e1f54c306..acb18259116 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_code_display.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_code_display.dart @@ -62,7 +62,6 @@ class _FunctionsColumn extends _CodeColumnData InliningEntry data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { return Row( children: [ @@ -165,7 +164,6 @@ class _InstructionColumn extends _CodeColumnData Instruction data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { final theme = Theme.of(context); return Text.rich( @@ -253,7 +251,6 @@ class _DartObjectColumn extends _CodeColumnData Instruction data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { if (data.object == null) return Container(); return VmServiceObjectLink( diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_instance_display.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_instance_display.dart index 492ad9f8139..8bd7e660189 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_instance_display.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_instance_display.dart @@ -163,57 +163,67 @@ class DisplayProvider extends StatelessWidget { Widget build(BuildContext context) { final theme = Theme.of(context); if (variable.text != null) { - return SelectableText.rich( - TextSpan( - children: textSpansFromAnsi( - variable.text ?? '', - theme.subtleFixedFontStyle, + return SelectionArea( + child: GestureDetector( + onTap: onTap, + child: Text.rich( + TextSpan( + children: textSpansFromAnsi( + variable.text ?? '', + theme.subtleFixedFontStyle, + ), + ), ), ), - onTap: onTap, ); } final hasName = variable.name?.isNotEmpty ?? false; - return Row( - children: [ - SelectableText.rich( - TextSpan( - text: hasName ? variable.name : null, - style: variable.artificialName - ? theme.subtleFixedFontStyle - : theme.fixedFontStyle.apply( - color: theme.colorScheme.controlFlowSyntaxColor, - ), - children: [ - if (hasName) TextSpan(text: ': ', style: theme.fixedFontStyle), - if (variable.ref!.value is Sentinel) - TextSpan( - text: 'Sentinel ${variable.displayValue.toString()}', - style: theme.subtleFixedFontStyle, - ), - ], - ), - onTap: onTap, - ), - if (variable.ref!.value is! Sentinel && variable.ref!.value is ObjRef?) - VmServiceObjectLink( - object: variable.ref!.value as ObjRef?, - textBuilder: (object) { - if (object is InstanceRef && - object.kind == InstanceKind.kString) { - return "'${object.valueAsString}'"; - } - return null; - }, - onTap: controller.findAndSelectNodeForObject, - ) - else - Text( - variable.ref!.value.toString(), - style: Theme.of(context).subtleFixedFontStyle, + return SelectionArea( + child: Row( + children: [ + GestureDetector( + onTap: onTap, + child: Text.rich( + TextSpan( + text: hasName ? variable.name : null, + style: variable.artificialName + ? theme.subtleFixedFontStyle + : theme.fixedFontStyle.apply( + color: theme.colorScheme.controlFlowSyntaxColor, + ), + children: [ + if (hasName) + TextSpan(text: ': ', style: theme.fixedFontStyle), + if (variable.ref!.value is Sentinel) + TextSpan( + text: 'Sentinel ${variable.displayValue.toString()}', + style: theme.subtleFixedFontStyle, + ), + ], + ), + ), ), - ], + if (variable.ref!.value is! Sentinel && + variable.ref!.value is ObjRef?) + VmServiceObjectLink( + object: variable.ref!.value as ObjRef?, + textBuilder: (object) { + if (object is InstanceRef && + object.kind == InstanceKind.kString) { + return "'${object.valueAsString}'"; + } + return null; + }, + onTap: controller.findAndSelectNodeForObject, + ) + else + Text( + variable.ref!.value.toString(), + style: Theme.of(context).subtleFixedFontStyle, + ), + ], + ), ); } } diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_library_display.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_library_display.dart index 71529a9eb3e..faa3d3efb42 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_library_display.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_library_display.dart @@ -69,22 +69,21 @@ class LibraryDependencies extends StatelessWidget { List dependencyRows(BuildContext context) { final textStyle = Theme.of(context).fixedFontStyle; - return [ for (final dep in dependencies) Row( - children: [ - Flexible(child: SelectableText(dep.description, style: textStyle)), - ], + children: [Flexible(child: Text(dep.description, style: textStyle))], ), ]; } @override Widget build(BuildContext context) { - return VmExpansionTile( - title: 'Dependencies (${dependencies.length})', - children: prettyRows(context, dependencyRows(context)), + return SelectionArea( + child: VmExpansionTile( + title: 'Dependencies (${dependencies.length})', + children: prettyRows(context, dependencyRows(context)), + ), ); } } diff --git a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_object_pool_display.dart b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_object_pool_display.dart index 2e0190144b6..fe633ea3b78 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_object_pool_display.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/object_inspector/vm_object_pool_display.dart @@ -52,7 +52,6 @@ class _DartObjectColumn extends _ObjectPoolColumnData ObjectPoolEntry data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }) { if (data.value is int) return Text(data.value.toString()); return VmServiceObjectLink( diff --git a/packages/devtools_app/lib/src/screens/vm_developer/queued_microtasks/queued_microtasks_view.dart b/packages/devtools_app/lib/src/screens/vm_developer/queued_microtasks/queued_microtasks_view.dart index f658b9a2c33..692c48e65a5 100644 --- a/packages/devtools_app/lib/src/screens/vm_developer/queued_microtasks/queued_microtasks_view.dart +++ b/packages/devtools_app/lib/src/screens/vm_developer/queued_microtasks/queued_microtasks_view.dart @@ -139,14 +139,16 @@ class MicrotaskStackTraceView extends StatelessWidget { Row( children: [ Expanded( - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: denseRowSpacing, - horizontal: defaultSpacing, - ), - child: SelectableText( - style: theme.fixedFontStyle, - _selectedMicrotask!.stackTrace.toString(), + child: SelectionArea( + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: denseRowSpacing, + horizontal: defaultSpacing, + ), + child: Text( + style: theme.fixedFontStyle, + _selectedMicrotask!.stackTrace.toString(), + ), ), ), ), diff --git a/packages/devtools_app/lib/src/service/connected_app/connection_info.dart b/packages/devtools_app/lib/src/service/connected_app/connection_info.dart index fd5a26e0230..c651fe0a885 100644 --- a/packages/devtools_app/lib/src/service/connected_app/connection_info.dart +++ b/packages/devtools_app/lib/src/service/connected_app/connection_info.dart @@ -76,13 +76,15 @@ class _ConnectionDescriptionColumn extends StatelessWidget { padding: EdgeInsets.only( bottom: entry == entries.last ? 0.0 : denseRowSpacing, ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text('${entry.title}: ', style: boldText), - SelectableText(entry.description, style: theme.subtleTextStyle), - if (entry.actions.isNotEmpty) ...entry.actions, - ], + child: SelectionArea( + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text('${entry.title}: ', style: boldText), + Text(entry.description, style: theme.subtleTextStyle), + if (entry.actions.isNotEmpty) ...entry.actions, + ], + ), ), ), ], diff --git a/packages/devtools_app/lib/src/shared/analytics/prompt.dart b/packages/devtools_app/lib/src/shared/analytics/prompt.dart index 0d26ecc7322..9b4aca268b9 100644 --- a/packages/devtools_app/lib/src/shared/analytics/prompt.dart +++ b/packages/devtools_app/lib/src/shared/analytics/prompt.dart @@ -96,38 +96,42 @@ class _AnalyticsPromptState extends State { // When failing to parse the consent message, fallback to displaying the // consent message in its regular form. if (consentMessageRegExpResults == null) { - return SelectableText.rich( + return SelectionArea( + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: adjustLineBreaks(controller.consentMessage), + style: theme.regularTextStyle, + ), + ], + ), + ), + ); + } + + return SelectionArea( + child: Text.rich( TextSpan( children: [ TextSpan( - text: adjustLineBreaks(controller.consentMessage), + text: consentMessageRegExpResults[0], + style: theme.regularTextStyle, + ), + LinkTextSpan( + link: GaLink( + display: consentMessageRegExpResults[1], + url: consentMessageRegExpResults[1], + ), + context: context, + style: theme.linkTextStyle, + ), + TextSpan( + text: consentMessageRegExpResults[2], style: theme.regularTextStyle, ), ], ), - ); - } - - return SelectableText.rich( - TextSpan( - children: [ - TextSpan( - text: consentMessageRegExpResults[0], - style: theme.regularTextStyle, - ), - LinkTextSpan( - link: GaLink( - display: consentMessageRegExpResults[1], - url: consentMessageRegExpResults[1], - ), - context: context, - style: theme.linkTextStyle, - ), - TextSpan( - text: consentMessageRegExpResults[2], - style: theme.regularTextStyle, - ), - ], ), ); } diff --git a/packages/devtools_app/lib/src/shared/console/widgets/description.dart b/packages/devtools_app/lib/src/shared/console/widgets/description.dart index 7b667b37f60..7ea83892fd9 100644 --- a/packages/devtools_app/lib/src/shared/console/widgets/description.dart +++ b/packages/devtools_app/lib/src/shared/console/widgets/description.dart @@ -571,7 +571,7 @@ class DescriptionDisplay extends StatelessWidget { @override Widget build(BuildContext context) { if (multiline) { - return SelectableText.rich(text); + return SelectionArea(child: Text.rich(text)); } if (actionLabel != null) { diff --git a/packages/devtools_app/lib/src/shared/table/_table_column.dart b/packages/devtools_app/lib/src/shared/table/_table_column.dart index 4506902859a..521d212b481 100644 --- a/packages/devtools_app/lib/src/shared/table/_table_column.dart +++ b/packages/devtools_app/lib/src/shared/table/_table_column.dart @@ -18,7 +18,6 @@ abstract class ColumnRenderer { T data, { bool isRowSelected = false, bool isRowHovered = false, - VoidCallback? onPressed, }); } diff --git a/packages/devtools_app/lib/src/shared/table/_table_row.dart b/packages/devtools_app/lib/src/shared/table/_table_row.dart index 293cf849741..763438888ec 100644 --- a/packages/devtools_app/lib/src/shared/table/_table_row.dart +++ b/packages/devtools_app/lib/src/shared/table/_table_row.dart @@ -272,7 +272,7 @@ class _TableRowState extends State> onPressed = () => widgetOnPressed(node); } - final row = tableRowFor(context, onPressed: onPressed); + final row = tableRowFor(context); final box = SizedBox( height: widget._rowType == _TableRowType.data @@ -401,7 +401,7 @@ class _TableRowState extends State> } /// Presents the content of this row. - Widget tableRowFor(BuildContext context, {VoidCallback? onPressed}) { + Widget tableRowFor(BuildContext context) { Widget columnFor(ColumnData column, double columnWidth) { Widget? content; final theme = Theme.of(context); @@ -439,7 +439,6 @@ class _TableRowState extends State> node, isRowSelected: widget.isSelected, isRowHovered: isHovering, - onPressed: onPressed, ); } // If ColumnRenderer.build returns null, fall back to the default diff --git a/packages/devtools_app/lib/src/shared/ui/common_widgets.dart b/packages/devtools_app/lib/src/shared/ui/common_widgets.dart index 566538cf159..8e7467d2186 100644 --- a/packages/devtools_app/lib/src/shared/ui/common_widgets.dart +++ b/packages/devtools_app/lib/src/shared/ui/common_widgets.dart @@ -1080,7 +1080,7 @@ class TextViewer extends StatelessWidget { } else { displayText = text; } - return SelectableText(displayText, style: style); + return SelectionArea(child: Text(displayText, style: style)); } } @@ -1768,24 +1768,29 @@ class PubWarningText extends StatelessWidget { serviceConnection.serviceManager.connectedApp!.isFlutterAppNow == true; final sdkName = isFlutterApp ? 'Flutter' : 'Dart'; final minSdkVersion = isFlutterApp ? '2.8.0' : '2.15.0'; - return SelectableText.rich( - TextSpan( - text: - 'Warning: you should no longer be launching DevTools from' - ' pub.\n\n', - style: theme.subtleTextStyle.copyWith(color: theme.colorScheme.error), - children: [ - TextSpan( - text: - 'DevTools version 2.8.0 will be the last version to ' - 'be shipped on pub. As of $sdkName\nversion >= ' - '$minSdkVersion, DevTools should be launched by running ' - 'the ', - style: theme.subtleTextStyle, - ), - TextSpan(text: '`dart devtools`', style: theme.subtleFixedFontStyle), - TextSpan(text: '\ncommand.', style: theme.subtleTextStyle), - ], + return SelectionArea( + child: Text.rich( + TextSpan( + text: + 'Warning: you should no longer be launching DevTools from' + ' pub.\n\n', + style: theme.subtleTextStyle.copyWith(color: theme.colorScheme.error), + children: [ + TextSpan( + text: + 'DevTools version 2.8.0 will be the last version to ' + 'be shipped on pub. As of $sdkName\nversion >= ' + '$minSdkVersion, DevTools should be launched by running ' + 'the ', + style: theme.subtleTextStyle, + ), + TextSpan( + text: '`dart devtools`', + style: theme.subtleFixedFontStyle, + ), + TextSpan(text: '\ncommand.', style: theme.subtleTextStyle), + ], + ), ), ); } diff --git a/packages/devtools_app/test/framework/scaffold/about_dialog_test.dart b/packages/devtools_app/test/framework/scaffold/about_dialog_test.dart index 25bf81aa6db..2b32b4c93c2 100644 --- a/packages/devtools_app/test/framework/scaffold/about_dialog_test.dart +++ b/packages/devtools_app/test/framework/scaffold/about_dialog_test.dart @@ -53,7 +53,7 @@ void main() { testWidgets('content renders correctly', (WidgetTester tester) async { await tester.pumpWidget(wrap(aboutDialog)); expect(find.text('About DevTools'), findsOneWidget); - expect(findSubstring(devtools.version), findsOneWidget); + expect(find.textContaining(devtools.version), findsOneWidget); expect(find.text('release notes'), findsOneWidget); expect(find.textContaining('Encountered an issue?'), findsOneWidget); expect( diff --git a/packages/devtools_app/test/screens/logging/logging_screen_data_test.dart b/packages/devtools_app/test/screens/logging/logging_screen_data_test.dart index 968ef191e1c..8852ab0c650 100644 --- a/packages/devtools_app/test/screens/logging/logging_screen_data_test.dart +++ b/packages/devtools_app/test/screens/logging/logging_screen_data_test.dart @@ -88,7 +88,7 @@ void main() { expect( find.descendant( of: find.byType(LogDetails), - matching: find.selectableText('log event 6'), + matching: find.text('log event 6'), ), findsOneWidget, reason: 'The log details should now be visible in the details section.', @@ -175,7 +175,7 @@ void main() { await tester.tap(find.byKey(ValueKey(log))); await tester.pump(); expect( - find.selectableText(nonJsonOutput), + find.text(nonJsonOutput), findsNothing, reason: "The details of the log haven't computed yet, so they shouldn't " @@ -183,7 +183,7 @@ void main() { ); await tester.pumpAndSettle(); - expect(find.selectableText(nonJsonOutput), findsOneWidget); + expect(find.text(nonJsonOutput), findsOneWidget); expect(find.byType(JsonViewer), findsNothing); // Toggle the log details view format to view as JSON. @@ -198,7 +198,7 @@ void main() { await tester.tap(find.byType(LogDetailsFormatButton)); await tester.pumpAndSettle(); - expect(find.selectableText(nonJsonOutput), findsNothing); + expect(find.text(nonJsonOutput), findsNothing); expect(find.byType(JsonViewer), findsOneWidget); expect( find.byTooltip(LogDetailsFormatButton.viewAsJsonTooltip), @@ -216,9 +216,11 @@ void main() { ) async { const index = 9; bool containsJson(Widget widget) { - if (widget is! SelectableText) return false; - final content = widget.data!.trim(); - return content.startsWith('{') && content.endsWith('}'); + if (widget is! Text) return false; + final content = (widget.data ?? '').trim(); + return content.startsWith('{') && + content.endsWith('}') && + content != '{ }'; } final findJson = find.descendant( diff --git a/packages/devtools_app/test/screens/network/network_profiler_test.dart b/packages/devtools_app/test/screens/network/network_profiler_test.dart index 15253ee4cf9..bee1cad22a7 100644 --- a/packages/devtools_app/test/screens/network/network_profiler_test.dart +++ b/packages/devtools_app/test/screens/network/network_profiler_test.dart @@ -307,16 +307,10 @@ void main() { expectNoSelection(); - final textElement = tester.element( - find - .text( - 'https://jsonplaceholder.typicode.com/albums/1?userId=1&title=myalbum', - ) - .first, + final textWidget = find.text( + 'https://jsonplaceholder.typicode.com/albums/1?userId=1&title=myalbum', ); - final selectableTextWidget = textElement - .findAncestorWidgetOfExactType()!; - await tester.tap(find.byWidget(selectableTextWidget)); + await tester.tap(textWidget); await tester.pumpAndSettle(); expect(controller.selectedRequest.value, isNotNull); diff --git a/packages/devtools_app/test/screens/vm_developer/object_inspector/vm_library_display_test.dart b/packages/devtools_app/test/screens/vm_developer/object_inspector/vm_library_display_test.dart index ff3d1ec0c54..21cc476035d 100644 --- a/packages/devtools_app/test/screens/vm_developer/object_inspector/vm_library_display_test.dart +++ b/packages/devtools_app/test/screens/vm_developer/object_inspector/vm_library_display_test.dart @@ -195,7 +195,7 @@ void main() { await tester.pumpAndSettle(); - expect(find.byType(SelectableText), findsNWidgets(3)); + expect(find.byType(Text), findsNWidgets(4)); }); }); } diff --git a/packages/devtools_app_shared/lib/src/ui/common.dart b/packages/devtools_app_shared/lib/src/ui/common.dart index f201d4a8781..90b196e04a2 100644 --- a/packages/devtools_app_shared/lib/src/ui/common.dart +++ b/packages/devtools_app_shared/lib/src/ui/common.dart @@ -517,9 +517,12 @@ final class FormattedJson extends StatelessWidget { @override Widget build(BuildContext context) { final theme = Theme.of(context); - return SelectableText( - json != null ? encoder.convert(json) : formattedString!, - style: useSubtleStyle ? theme.subtleFixedFontStyle : theme.fixedFontStyle, + return SelectionArea( + child: Text( + json != null ? encoder.convert(json) : formattedString!, + style: + useSubtleStyle ? theme.subtleFixedFontStyle : theme.fixedFontStyle, + ), ); } }