Enable `ColumnData` and subclasses to be const (#9326)

diff --git a/packages/devtools_app/lib/src/screens/app_size/app_size_table.dart b/packages/devtools_app/lib/src/screens/app_size/app_size_table.dart
index 88b76ab..9e06c28 100644
--- a/packages/devtools_app/lib/src/screens/app_size/app_size_table.dart
+++ b/packages/devtools_app/lib/src/screens/app_size/app_size_table.dart
@@ -22,7 +22,7 @@
           ? rootNode.children.first.level
           : rootNode.level,
     );
-    final sizeColumn = _SizeColumn();
+    const sizeColumn = _SizeColumn();
     final columns = List<ColumnData<TreemapNode>>.unmodifiable([
       treeColumn,
       sizeColumn,
@@ -77,7 +77,8 @@
 }
 
 class _NameColumn extends TreeColumnData<TreemapNode> {
-  _NameColumn({required this.currentRootLevel}) : super('Library or Class');
+  const _NameColumn({required this.currentRootLevel})
+    : super('Library or Class');
 
   final int currentRootLevel;
 
@@ -98,7 +99,7 @@
 }
 
 class _SizeColumn extends ColumnData<TreemapNode> {
-  _SizeColumn()
+  const _SizeColumn()
     : super('Size', alignment: ColumnAlignment.right, fixedWidthPx: 100.0);
 
   @override
@@ -118,7 +119,7 @@
 }
 
 class _SizePercentageColumn extends ColumnData<TreemapNode> {
-  _SizePercentageColumn({required this.totalSize})
+  const _SizePercentageColumn({required this.totalSize})
     : super(
         '% of Total Size',
         alignment: ColumnAlignment.right,
@@ -146,7 +147,7 @@
 class AppSizeDiffTable extends StatelessWidget {
   factory AppSizeDiffTable({required TreemapNode rootNode}) {
     final treeColumn = _NameColumn(currentRootLevel: rootNode.level);
-    final diffColumn = _DiffColumn();
+    const diffColumn = _DiffColumn();
     final columns = List<ColumnData<TreemapNode>>.unmodifiable([
       treeColumn,
       diffColumn,
@@ -188,7 +189,7 @@
 // TODO(peterdjlee): Add an opaque overlay / background to differentiate from
 //                   other columns.
 class _DiffColumn extends ColumnData<TreemapNode> {
-  _DiffColumn()
+  const _DiffColumn()
     : super('Change', alignment: ColumnAlignment.right, fixedWidthPx: 100.0);
 
   // Ensure sort by absolute size.
diff --git a/packages/devtools_app/lib/src/screens/app_size/code_size_attribution.dart b/packages/devtools_app/lib/src/screens/app_size/code_size_attribution.dart
index b3c3668..739905b 100644
--- a/packages/devtools_app/lib/src/screens/app_size/code_size_attribution.dart
+++ b/packages/devtools_app/lib/src/screens/app_size/code_size_attribution.dart
@@ -211,8 +211,8 @@
     required this.onNodeSelected,
   });
 
-  static final _toColumn = ToColumn();
-  static final _fromColumn = FromColumn();
+  static const _toColumn = ToColumn();
+  static const _fromColumn = FromColumn();
 
   final _CallGraphTableType tableType;
 
@@ -240,14 +240,14 @@
 }
 
 class FromColumn extends ColumnData<CallGraphNode> {
-  FromColumn() : super.wide('From');
+  const FromColumn() : super.wide('From');
 
   @override
   String getValue(CallGraphNode dataObject) => dataObject.display;
 }
 
 class ToColumn extends ColumnData<CallGraphNode> {
-  ToColumn() : super.wide('To');
+  const ToColumn() : super.wide('To');
 
   @override
   ColumnAlignment get alignment => ColumnAlignment.right;
@@ -260,7 +260,7 @@
 }
 
 class DominatorTree extends StatelessWidget {
-  DominatorTree({
+  const DominatorTree({
     super.key,
     required this.dominatorTreeRoot,
     required this.selectedNode,
@@ -272,7 +272,7 @@
 
   final CallGraphNode? selectedNode;
 
-  final _packageColumn = _PackageColumn();
+  static const _packageColumn = _PackageColumn();
 
   @override
   Widget build(BuildContext context) {
@@ -283,7 +283,7 @@
       dataRoots: [dominatorTreeRoot!],
       dataKey: 'dominator-tree',
       keyFactory: (node) => PageStorageKey<String>('${node.callGraphNode.id}'),
-      columns: [_packageColumn],
+      columns: const [_packageColumn],
       treeColumn: _packageColumn,
       defaultSortColumn: _packageColumn,
       defaultSortDirection: SortDirection.descending,
@@ -304,7 +304,7 @@
 }
 
 class _PackageColumn extends TreeColumnData<DominatorTreeNode> {
-  _PackageColumn() : super('Package');
+  const _PackageColumn() : super('Package');
 
   @override
   String getValue(DominatorTreeNode dataObject) =>
diff --git a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_link_list_view.dart b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_link_list_view.dart
index cb10ad5..56308e8 100644
--- a/packages/devtools_app/lib/src/screens/deep_link_validation/deep_link_list_view.dart
+++ b/packages/devtools_app/lib/src/screens/deep_link_validation/deep_link_list_view.dart
@@ -207,9 +207,9 @@
           ...(() {
             switch (viewType) {
               case TableViewType.domainView:
-                return [domain, NumberOfAssociatedPathColumn()];
+                return [domain, const NumberOfAssociatedPathColumn()];
               case TableViewType.pathView:
-                return [path, NumberOfAssociatedDomainColumn()];
+                return [path, const NumberOfAssociatedDomainColumn()];
               case TableViewType.singleUrlView:
                 return <ColumnData<LinkData>>[domain, path];
             }
@@ -218,7 +218,7 @@
           OSColumn(controller),
           if (!controller.displayOptionsNotifier.value.showSplitScreen) ...[
             StatusColumn(controller, viewType),
-            NavigationColumn(),
+            const NavigationColumn(),
           ],
         ],
         selectionNotifier: controller.selectedLink,
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 9eaf19a..0a2d4d5 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
@@ -672,7 +672,8 @@
 }
 
 class NumberOfAssociatedPathColumn extends ColumnData<LinkData> {
-  NumberOfAssociatedPathColumn() : super.wide('Number of associated path');
+  const NumberOfAssociatedPathColumn()
+    : super.wide('Number of associated path');
 
   @override
   String getValue(LinkData dataObject) =>
@@ -680,7 +681,8 @@
 }
 
 class NumberOfAssociatedDomainColumn extends ColumnData<LinkData> {
-  NumberOfAssociatedDomainColumn() : super.wide('Number of associated domain');
+  const NumberOfAssociatedDomainColumn()
+    : super.wide('Number of associated domain');
 
   @override
   String getValue(LinkData dataObject) =>
@@ -741,9 +743,9 @@
 
 class OSColumn extends ColumnData<LinkData>
     implements ColumnRenderer<LinkData>, ColumnHeaderRenderer<LinkData> {
-  OSColumn(this.controller) : super.wide('OS');
+  const OSColumn(this.controller) : super.wide('OS');
 
-  DeepLinksController controller;
+  final DeepLinksController controller;
 
   @override
   bool get supportsSorting {
@@ -874,7 +876,7 @@
 
 class NavigationColumn extends ColumnData<LinkData>
     implements ColumnRenderer<LinkData> {
-  NavigationColumn() : super('', fixedWidthPx: 40);
+  const NavigationColumn() : super('', fixedWidthPx: 40);
 
   @override
   bool get supportsSorting => false;
diff --git a/packages/devtools_app/lib/src/screens/logging/_logs_table.dart b/packages/devtools_app/lib/src/screens/logging/_logs_table.dart
index f23edc2..0475919 100644
--- a/packages/devtools_app/lib/src/screens/logging/_logs_table.dart
+++ b/packages/devtools_app/lib/src/screens/logging/_logs_table.dart
@@ -29,8 +29,8 @@
   final ValueListenable<List<LogData>> searchMatchesNotifier;
   final ValueListenable<LogData?> activeSearchMatchNotifier;
 
-  static final whenColumn = WhenColumn();
-  static final messageColumn = MessageColumn();
+  static const whenColumn = WhenColumn();
+  static const messageColumn = MessageColumn();
   static final columns = [whenColumn, messageColumn];
 
   @override
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 51277b2..6e806e9 100644
--- a/packages/devtools_app/lib/src/screens/logging/_message_column.dart
+++ b/packages/devtools_app/lib/src/screens/logging/_message_column.dart
@@ -13,7 +13,7 @@
 
 class MessageColumn extends ColumnData<LogData>
     implements ColumnRenderer<LogData> {
-  MessageColumn() : super.wide('Log');
+  const MessageColumn() : super.wide('Log');
 
   @override
   bool get supportsSorting => false;
diff --git a/packages/devtools_app/lib/src/screens/logging/_when_column.dart b/packages/devtools_app/lib/src/screens/logging/_when_column.dart
index d929f1f..c213b6a 100644
--- a/packages/devtools_app/lib/src/screens/logging/_when_column.dart
+++ b/packages/devtools_app/lib/src/screens/logging/_when_column.dart
@@ -6,7 +6,7 @@
 import 'logging_controller.dart';
 
 class WhenColumn extends ColumnData<LogData> {
-  WhenColumn() : super('When', fixedWidthPx: 80);
+  const WhenColumn() : super('When', fixedWidthPx: 80);
 
   @override
   bool get supportsSorting => false;
diff --git a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/class_details/paths.dart b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/class_details/paths.dart
index 1408c90..638c87e 100644
--- a/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/class_details/paths.dart
+++ b/packages/devtools_app/lib/src/screens/memory/panes/diff/widgets/class_details/paths.dart
@@ -15,7 +15,7 @@
 import '../../controller/class_data.dart';
 
 class _RetainingPathColumn extends ColumnData<PathData> {
-  _RetainingPathColumn(String className)
+  const _RetainingPathColumn(String className)
     : super.wide(
         'Shortest Retaining Path for Instances of $className',
         titleTooltip:
@@ -33,7 +33,7 @@
 }
 
 class _InstanceColumn extends ColumnData<PathData> {
-  _InstanceColumn(bool isDiff)
+  const _InstanceColumn(bool isDiff)
     : super(
         isDiff ? 'Instance\nDelta' : 'Instances',
         titleTooltip:
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 f2d4db2..c6a6f59 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
@@ -25,7 +25,7 @@
     implements
         ColumnRenderer<DiffClassData>,
         ColumnHeaderRenderer<DiffClassData> {
-  _ClassNameColumn(this.diffData)
+  const _ClassNameColumn(this.diffData)
     : super(
         'Class',
         titleTooltip: 'Class name',
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 fd18285..59b299f 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
@@ -22,7 +22,7 @@
     implements
         ColumnRenderer<SingleClassData>,
         ColumnHeaderRenderer<SingleClassData> {
-  _ClassNameColumn(this.data)
+  const _ClassNameColumn(this.data)
     : super(
         'Class',
         titleTooltip: 'Class name',
@@ -72,7 +72,7 @@
 
 class _InstanceColumn extends ColumnData<SingleClassData>
     implements ColumnRenderer<SingleClassData> {
-  _InstanceColumn(this.classData)
+  const _InstanceColumn(this.classData)
     : super(
         'Instances',
         titleTooltip: nonGcableInstancesColumnTooltip,
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 b8ff82d..d424f87 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
@@ -36,7 +36,7 @@
     implements
         ColumnRenderer<ProfileRecord>,
         ColumnHeaderRenderer<ProfileRecord> {
-  _FieldClassNameColumn(this.classFilterData)
+  const _FieldClassNameColumn(this.classFilterData)
     : super('Class', fixedWidthPx: 200);
 
   @override
@@ -103,7 +103,7 @@
 
 class _FieldInstanceCountColumn extends ColumnData<ProfileRecord>
     implements ColumnRenderer<ProfileRecord> {
-  _FieldInstanceCountColumn({required this.heap})
+  const _FieldInstanceCountColumn({required this.heap})
     : super(
         'Instances',
         titleTooltip: 'The number of instances of the class in the heap',
@@ -146,8 +146,8 @@
 }
 
 class _FieldExternalSizeColumn extends _FieldSizeColumn {
-  _FieldExternalSizeColumn({required super.heap})
-    : super._(
+  const _FieldExternalSizeColumn({required super.heap})
+    : super(
         title: 'External',
         titleTooltip:
             'Non-Dart heap allocated memory associated with a Dart object',
@@ -168,7 +168,7 @@
 
 class _FieldDartHeapSizeColumn extends _FieldSizeColumn {
   _FieldDartHeapSizeColumn({required super.heap})
-    : super._(title: 'Dart Heap', titleTooltip: SizeType.shallow.description);
+    : super(title: 'Dart Heap', titleTooltip: SizeType.shallow.description);
 
   @override
   int? getValue(ProfileRecord dataObject) {
@@ -184,19 +184,12 @@
 }
 
 class _FieldSizeColumn extends ColumnData<ProfileRecord> {
-  factory _FieldSizeColumn({required HeapGeneration heap}) =>
-      _FieldSizeColumn._(
-        title: 'Total Size',
-        titleTooltip:
-            "The sum of the type's total shallow memory "
-            'consumption in the Dart heap and associated external (e.g., '
-            'non-Dart heap) allocations',
-        heap: heap,
-      );
-
-  _FieldSizeColumn._({
-    required String title,
-    required String titleTooltip,
+  const _FieldSizeColumn({
+    String title = 'Total Size',
+    String titleTooltip =
+        "The sum of the type's total shallow memory "
+        'consumption in the Dart heap and associated external (e.g., '
+        'non-Dart heap) allocations',
     required this.heap,
   }) : super(
          title,
@@ -231,7 +224,7 @@
 }
 
 abstract class _GCHeapStatsColumn extends ColumnData<AdaptedProfile> {
-  _GCHeapStatsColumn(
+  const _GCHeapStatsColumn(
     super.title, {
     required this.generation,
     required super.fixedWidthPx,
@@ -254,7 +247,7 @@
 }
 
 class _GCHeapNameColumn extends ColumnData<AdaptedProfile> {
-  _GCHeapNameColumn() : super('', fixedWidthPx: 200);
+  const _GCHeapNameColumn() : super('', fixedWidthPx: 200);
 
   @override
   String? getValue(AdaptedProfile dataObject) {
@@ -381,7 +374,7 @@
   ];
 
   static final _columns = [
-    _GCHeapNameColumn(),
+    const _GCHeapNameColumn(),
     for (final generation in [
       HeapGeneration.total,
       HeapGeneration.newSpace,
@@ -502,7 +495,7 @@
     ),
   ];
 
-  static final _fieldSizeColumn = _FieldSizeColumn(heap: HeapGeneration.total);
+  static const _fieldSizeColumn = _FieldSizeColumn(heap: HeapGeneration.total);
 
   late final _columns = <ColumnData<ProfileRecord>>[
     _FieldClassNameColumn(
@@ -512,21 +505,21 @@
         rootPackage: controller.rootPackage,
       ),
     ),
-    _FieldInstanceCountColumn(heap: HeapGeneration.total),
+    const _FieldInstanceCountColumn(heap: HeapGeneration.total),
     _fieldSizeColumn,
     _FieldDartHeapSizeColumn(heap: HeapGeneration.total),
   ];
 
   late final _advancedDeveloperModeColumns = [
-    _FieldExternalSizeColumn(heap: HeapGeneration.total),
-    _FieldInstanceCountColumn(heap: HeapGeneration.newSpace),
-    _FieldSizeColumn(heap: HeapGeneration.newSpace),
+    const _FieldExternalSizeColumn(heap: HeapGeneration.total),
+    const _FieldInstanceCountColumn(heap: HeapGeneration.newSpace),
+    const _FieldSizeColumn(heap: HeapGeneration.newSpace),
     _FieldDartHeapSizeColumn(heap: HeapGeneration.newSpace),
-    _FieldExternalSizeColumn(heap: HeapGeneration.newSpace),
-    _FieldInstanceCountColumn(heap: HeapGeneration.oldSpace),
-    _FieldSizeColumn(heap: HeapGeneration.oldSpace),
+    const _FieldExternalSizeColumn(heap: HeapGeneration.newSpace),
+    const _FieldInstanceCountColumn(heap: HeapGeneration.oldSpace),
+    const _FieldSizeColumn(heap: HeapGeneration.oldSpace),
     _FieldDartHeapSizeColumn(heap: HeapGeneration.oldSpace),
-    _FieldExternalSizeColumn(heap: HeapGeneration.oldSpace),
+    const _FieldExternalSizeColumn(heap: HeapGeneration.oldSpace),
   ];
 
   final ProfilePaneController controller;
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 136e224..e28a9f2 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
@@ -22,7 +22,7 @@
 
 class _TraceCheckBoxColumn extends ColumnData<TracedClass>
     implements ColumnRenderer<TracedClass> {
-  _TraceCheckBoxColumn({required this.controller})
+  const _TraceCheckBoxColumn({required this.controller})
     : super(
         'Trace',
         titleTooltip:
@@ -69,7 +69,7 @@
 
 class _ClassNameColumn extends ColumnData<TracedClass>
     implements ColumnRenderer<TracedClass> {
-  _ClassNameColumn({required this.rootPackage}) : super.wide('Class');
+  const _ClassNameColumn({required this.rootPackage}) : super.wide('Class');
 
   @override
   String? getValue(TracedClass stats) => stats.clazz.name;
@@ -98,7 +98,7 @@
 }
 
 class _InstancesColumn extends ColumnData<TracedClass> {
-  _InstancesColumn()
+  const _InstancesColumn()
     : super(
         'Delta',
         titleTooltip:
@@ -127,7 +127,7 @@
 class _AllocationTracingTableState extends State<AllocationTracingTable> {
   late final _TraceCheckBoxColumn _checkboxColumn;
   late final _ClassNameColumn _classNameColumn;
-  static final _instancesColumn = _InstancesColumn();
+  static const _instancesColumn = _InstancesColumn();
 
   late final List<ColumnData<TracedClass>> columns;
 
diff --git a/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_tree.dart b/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_tree.dart
index caa2b3d..981ebf0 100644
--- a/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_tree.dart
+++ b/packages/devtools_app/lib/src/screens/memory/panes/tracing/tracing_tree.dart
@@ -225,7 +225,7 @@
 }
 
 class _InclusiveCountColumn extends ColumnData<CpuStackFrame> {
-  _InclusiveCountColumn()
+  const _InclusiveCountColumn()
     : super(
         'Inclusive',
         titleTooltip: _tooltip,
@@ -258,7 +258,7 @@
 }
 
 class _ExclusiveCountColumn extends ColumnData<CpuStackFrame> {
-  _ExclusiveCountColumn()
+  const _ExclusiveCountColumn()
     : super(
         'Exclusive',
         titleTooltip: _tooltip,
@@ -294,11 +294,11 @@
 class TracingTable extends StatelessWidget {
   const TracingTable({super.key, required this.dataRoots});
 
-  static final treeColumn = MethodAndSourceColumn();
-  static final startingSortColumn = _InclusiveCountColumn();
+  static const treeColumn = MethodAndSourceColumn();
+  static const startingSortColumn = _InclusiveCountColumn();
   static final columns = List<ColumnData<CpuStackFrame>>.unmodifiable([
     startingSortColumn,
-    _ExclusiveCountColumn(),
+    const _ExclusiveCountColumn(),
     treeColumn,
   ]);
 
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 254f49d..4d830d2 100644
--- a/packages/devtools_app/lib/src/screens/network/network_screen.dart
+++ b/packages/devtools_app/lib/src/screens/network/network_screen.dart
@@ -312,13 +312,13 @@
     required this.activeSearchMatchNotifier,
   });
 
-  static final methodColumn = MethodColumn();
+  static const methodColumn = MethodColumn();
   static final addressColumn = AddressColumn();
-  static final statusColumn = StatusColumn();
-  static final typeColumn = TypeColumn();
-  static final durationColumn = DurationColumn();
+  static const statusColumn = StatusColumn();
+  static const typeColumn = TypeColumn();
+  static const durationColumn = DurationColumn();
   static final timestampColumn = TimestampColumn();
-  static final actionsColumn = ActionsColumn();
+  static const actionsColumn = ActionsColumn();
   static final columns = <ColumnData<NetworkRequest>>[
     methodColumn,
     addressColumn,
@@ -396,7 +396,7 @@
 }
 
 class MethodColumn extends ColumnData<NetworkRequest> {
-  MethodColumn() : super('Method', fixedWidthPx: 60);
+  const MethodColumn() : super('Method', fixedWidthPx: 60);
 
   @override
   String getValue(NetworkRequest dataObject) {
@@ -406,7 +406,7 @@
 
 class ActionsColumn extends ColumnData<NetworkRequest>
     implements ColumnRenderer<NetworkRequest> {
-  ActionsColumn()
+  const ActionsColumn()
     : super('', fixedWidthPx: 32, alignment: ColumnAlignment.right);
 
   @override
@@ -465,7 +465,7 @@
 
 class StatusColumn extends ColumnData<NetworkRequest>
     implements ColumnRenderer<NetworkRequest> {
-  StatusColumn()
+  const StatusColumn()
     : super(
         'Status',
         alignment: ColumnAlignment.right,
@@ -502,7 +502,7 @@
 }
 
 class TypeColumn extends ColumnData<NetworkRequest> {
-  TypeColumn()
+  const TypeColumn()
     : super(
         'Type',
         alignment: ColumnAlignment.right,
@@ -522,7 +522,7 @@
 }
 
 class DurationColumn extends ColumnData<NetworkRequest> {
-  DurationColumn()
+  const DurationColumn()
     : super(
         'Duration',
         alignment: ColumnAlignment.right,
diff --git a/packages/devtools_app/lib/src/screens/performance/panes/rebuild_stats/rebuild_stats.dart b/packages/devtools_app/lib/src/screens/performance/panes/rebuild_stats/rebuild_stats.dart
index b5ce564..a19d250 100644
--- a/packages/devtools_app/lib/src/screens/performance/panes/rebuild_stats/rebuild_stats.dart
+++ b/packages/devtools_app/lib/src/screens/performance/panes/rebuild_stats/rebuild_stats.dart
@@ -193,8 +193,8 @@
     return columns;
   }
 
-  static final _widgetColumn = _WidgetColumn();
-  static final _locationColumn = _LocationColumn();
+  static const _widgetColumn = _WidgetColumn();
+  static const _locationColumn = _LocationColumn();
 
   List<ColumnData<RebuildLocationStats>> get _columns => [
     _widgetColumn,
@@ -229,7 +229,7 @@
 }
 
 class _WidgetColumn extends ColumnData<RebuildLocationStats> {
-  _WidgetColumn() : super('Widget', fixedWidthPx: 200);
+  const _WidgetColumn() : super('Widget', fixedWidthPx: 200);
 
   @override
   String getValue(RebuildLocationStats dataObject) {
@@ -238,7 +238,7 @@
 }
 
 class _LocationColumn extends ColumnData<RebuildLocationStats> {
-  _LocationColumn() : super.wide('Location');
+  const _LocationColumn() : super.wide('Location');
 
   @override
   String getValue(RebuildLocationStats dataObject) {
diff --git a/packages/devtools_app/lib/src/screens/profiler/panes/bottom_up.dart b/packages/devtools_app/lib/src/screens/profiler/panes/bottom_up.dart
index d12cfe5..d240dfe 100644
--- a/packages/devtools_app/lib/src/screens/profiler/panes/bottom_up.dart
+++ b/packages/devtools_app/lib/src/screens/profiler/panes/bottom_up.dart
@@ -15,7 +15,7 @@
 class CpuBottomUpTable extends StatelessWidget {
   const CpuBottomUpTable({required this.bottomUpRoots, super.key});
 
-  static final methodColumn = MethodAndSourceColumn();
+  static const methodColumn = MethodAndSourceColumn();
   static final selfTimeColumn = SelfTimeColumn(
     titleTooltip: selfTimeTooltip,
     dataTooltipProvider: (stackFrame, context) =>
diff --git a/packages/devtools_app/lib/src/screens/profiler/panes/call_tree.dart b/packages/devtools_app/lib/src/screens/profiler/panes/call_tree.dart
index 32462db..1169427 100644
--- a/packages/devtools_app/lib/src/screens/profiler/panes/call_tree.dart
+++ b/packages/devtools_app/lib/src/screens/profiler/panes/call_tree.dart
@@ -14,7 +14,7 @@
 class CpuCallTreeTable extends StatelessWidget {
   const CpuCallTreeTable({required this.dataRoots, super.key});
 
-  static final methodColumn = MethodAndSourceColumn();
+  static const methodColumn = MethodAndSourceColumn();
 
   static final selfTimeColumn = SelfTimeColumn(titleTooltip: selfTimeTooltip);
 
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 9bd4d52..4696bed 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
@@ -37,7 +37,7 @@
 
 class MethodAndSourceColumn extends TreeColumnData<CpuStackFrame>
     implements ColumnRenderer<CpuStackFrame> {
-  MethodAndSourceColumn() : super('Method');
+  const MethodAndSourceColumn() : super('Method');
 
   @override
   String getValue(CpuStackFrame dataObject) => dataObject.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 3963ad6..55ddcee 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
@@ -46,7 +46,7 @@
 class MethodTable extends StatelessWidget {
   const MethodTable(this._methodTableController, this._methods, {super.key});
 
-  static final methodColumn = _MethodColumn();
+  static const methodColumn = _MethodColumn();
   static final selfTimeColumn = _SelfTimeColumn();
   static final totalTimeColumn = _TotalTimeColumn();
   static final columns = List<ColumnData<MethodTableGraphNode>>.unmodifiable([
@@ -90,11 +90,12 @@
 }
 
 class _MethodGraphState extends State<_MethodGraph> with AutoDisposeMixin {
-  MethodTableGraphNode? _selectedGraphNode;
-
-  List<MethodTableGraphNode> _callers = [];
-
-  List<MethodTableGraphNode> _callees = [];
+  ({
+    MethodTableGraphNode graphNode,
+    List<MethodTableGraphNode> callers,
+    List<MethodTableGraphNode> callees,
+  })?
+  _selected;
 
   @override
   void initState() {
@@ -109,30 +110,34 @@
   }
 
   void _initGraphNodes() {
-    _selectedGraphNode = widget.methodTableController.selectedNode.value;
-    if (_selectedGraphNode == null) {
-      _callers = <MethodTableGraphNode>[];
-      _callees = <MethodTableGraphNode>[];
+    final selectedGraphNode = widget.methodTableController.selectedNode.value;
+    if (selectedGraphNode == null) {
+      _selected = null;
     } else {
-      _callers = _selectedGraphNode!.predecessors
-          .cast<MethodTableGraphNode>()
-          .toList();
-      _callees = _selectedGraphNode!.successors
-          .cast<MethodTableGraphNode>()
-          .toList();
+      _selected = (
+        graphNode: selectedGraphNode,
+        callers: selectedGraphNode.predecessors
+            .cast<MethodTableGraphNode>()
+            .toList(),
+        callees: selectedGraphNode.successors
+            .cast<MethodTableGraphNode>()
+            .toList(),
+      );
     }
   }
 
   @override
   Widget build(BuildContext context) {
-    final selectedNode = _selectedGraphNode;
-    if (selectedNode == null) {
+    final selected = _selected;
+    if (selected == null) {
       return OutlineDecoration.onlyLeft(
         child: const Center(
           child: Text('Select a method to view its call graph.'),
         ),
       );
     }
+
+    final selectedNode = selected.graphNode;
     final selectedNodeDisplay = selectedNode.display;
     return OutlineDecoration.onlyLeft(
       child: Column(
@@ -140,7 +145,10 @@
         children: [
           Flexible(
             child: OutlineDecoration.onlyBottom(
-              child: _CallersTable(widget.methodTableController, _callers),
+              child: _CallersTable(
+                widget.methodTableController,
+                selected.callers,
+              ),
             ),
           ),
           DevToolsTooltip(
@@ -160,7 +168,10 @@
           ),
           Flexible(
             child: OutlineDecoration.onlyTop(
-              child: _CalleesTable(widget.methodTableController, _callees),
+              child: _CalleesTable(
+                widget.methodTableController,
+                selected.callees,
+              ),
             ),
           ),
         ],
@@ -171,25 +182,16 @@
 
 /// A table of predecessors (callers) for a single method in a method table.
 class _CallersTable extends StatelessWidget {
-  _CallersTable(this._methodTableController, this._callers) {
-    _callerTimeColumn = _CallerTimeColumn(
-      methodTableController: _methodTableController,
-    );
-    columns = List<ColumnData<MethodTableGraphNode>>.unmodifiable([
-      _callerTimeColumn,
-      methodColumn,
-    ]);
-  }
-
-  static final methodColumn = _MethodColumn();
+  _CallersTable(this._methodTableController, this._callers)
+    : _callerTimeColumn = _CallerTimeColumn(
+        methodTableController: _methodTableController,
+      );
 
   final MethodTableController _methodTableController;
 
   final List<MethodTableGraphNode> _callers;
 
-  late final List<ColumnData<MethodTableGraphNode>> columns;
-
-  late final _CallerTimeColumn _callerTimeColumn;
+  final _CallerTimeColumn _callerTimeColumn;
 
   @override
   Widget build(BuildContext context) {
@@ -197,7 +199,7 @@
       keyFactory: (node) => ValueKey('caller-${node.id}'),
       data: _callers,
       dataKey: 'cpu-profile-method-callers',
-      columns: columns,
+      columns: [_callerTimeColumn, const _MethodColumn()],
       defaultSortColumn: _callerTimeColumn,
       defaultSortDirection: SortDirection.descending,
       selectionNotifier: _methodTableController.selectedNode,
@@ -208,25 +210,16 @@
 
 /// A table of successors (callees) for a single method in a method table.
 class _CalleesTable extends StatelessWidget {
-  _CalleesTable(this._methodTableController, this._callees) {
-    _calleeTimeColumn = _CalleeTimeColumn(
-      methodTableController: _methodTableController,
-    );
-    _columns = List<ColumnData<MethodTableGraphNode>>.unmodifiable([
-      _calleeTimeColumn,
-      _methodColumn,
-    ]);
-  }
-
-  static final _methodColumn = _MethodColumn();
+  _CalleesTable(this._methodTableController, this._callees)
+    : _calleeTimeColumn = _CalleeTimeColumn(
+        methodTableController: _methodTableController,
+      );
 
   final MethodTableController _methodTableController;
 
   final List<MethodTableGraphNode> _callees;
 
-  late final List<ColumnData<MethodTableGraphNode>> _columns;
-
-  late final _CalleeTimeColumn _calleeTimeColumn;
+  final _CalleeTimeColumn _calleeTimeColumn;
 
   @override
   Widget build(BuildContext context) {
@@ -234,7 +227,7 @@
       keyFactory: (node) => ValueKey('callee-${node.id}'),
       data: _callees,
       dataKey: 'cpu-profile-method-callees',
-      columns: _columns,
+      columns: [_calleeTimeColumn, const _MethodColumn()],
       defaultSortColumn: _calleeTimeColumn,
       defaultSortDirection: SortDirection.descending,
       selectionNotifier: _methodTableController.selectedNode,
@@ -245,7 +238,8 @@
 
 class _MethodColumn extends ColumnData<MethodTableGraphNode>
     implements ColumnRenderer<MethodTableGraphNode> {
-  _MethodColumn() : super.wide('Method', minWidthPx: _methodColumnMinWidth);
+  const _MethodColumn()
+    : super.wide('Method', minWidthPx: _methodColumnMinWidth);
 
   @override
   String getValue(MethodTableGraphNode dataObject) => dataObject.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 736b94f..73f3b57 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
@@ -14,7 +14,7 @@
 import 'object_store_controller.dart';
 
 class _EntryColumn extends ColumnData<ObjectStoreEntry> {
-  _EntryColumn() : super.wide('Entry');
+  const _EntryColumn() : super.wide('Entry');
 
   @override
   bool get includeHeader => true;
@@ -68,7 +68,7 @@
     required this.controller,
   });
 
-  static final _entryColumn = _EntryColumn();
+  static const _entryColumn = _EntryColumn();
   late final _objectColumn = _ObjectColumn(onTap: onLinkTapped);
   late final _columns = <ColumnData<ObjectStoreEntry>>[
     _entryColumn,
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 52e1f54..4a5938f 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
@@ -18,8 +18,8 @@
 import 'vm_object_model.dart';
 
 abstract class _CodeColumnData<T> extends ColumnData<T> {
-  _CodeColumnData(super.title, {required super.fixedWidthPx});
-  _CodeColumnData.wide(super.title) : super.wide();
+  const _CodeColumnData(super.title, {required super.fixedWidthPx});
+  const _CodeColumnData.wide(super.title) : super.wide();
 
   @override
   bool get supportsSorting => false;
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 2e01901..f1f7994 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
@@ -15,8 +15,8 @@
 import 'vm_object_model.dart';
 
 abstract class _ObjectPoolColumnData extends ColumnData<ObjectPoolEntry> {
-  _ObjectPoolColumnData(super.title, {required super.fixedWidthPx});
-  _ObjectPoolColumnData.wide(super.title) : super.wide();
+  const _ObjectPoolColumnData(super.title, {required super.fixedWidthPx});
+  const _ObjectPoolColumnData.wide(super.title) : super.wide();
 
   @override
   bool get supportsSorting => false;
diff --git a/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_tree_columns.dart b/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_tree_columns.dart
index 80e02f4..71e6e2f 100644
--- a/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_tree_columns.dart
+++ b/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_tree_columns.dart
@@ -7,7 +7,7 @@
 import 'process_memory_view_controller.dart';
 
 class CategoryColumn extends TreeColumnData<TreemapNode> {
-  CategoryColumn() : super('Category');
+  const CategoryColumn() : super('Category');
 
   @override
   String getValue(TreemapNode dataObject) => dataObject.name;
diff --git a/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_view.dart b/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_view.dart
index ea9aa2d..1b453e0 100644
--- a/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_view.dart
+++ b/packages/devtools_app/lib/src/screens/vm_developer/process_memory/process_memory_view.dart
@@ -175,7 +175,7 @@
 
   final VMProcessMemoryViewController controller;
 
-  static final categoryColumn = CategoryColumn();
+  static const categoryColumn = CategoryColumn();
   static final descriptionColumn = DescriptionColumn();
 
   late final memoryColumn = MemoryColumn(controller: controller);
diff --git a/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view.dart b/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view.dart
index 2845e46..a2b9d49 100644
--- a/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view.dart
+++ b/packages/devtools_app/lib/src/screens/vm_developer/vm_statistics/vm_statistics_view.dart
@@ -184,7 +184,7 @@
 }
 
 class _IsolateNameColumn extends ColumnData<Isolate> {
-  _IsolateNameColumn() : super.wide('Name');
+  const _IsolateNameColumn() : super.wide('Name');
 
   @override
   String getValue(Isolate i) => i.name!;
@@ -261,7 +261,7 @@
     this.systemIsolates = false,
   });
 
-  static final name = _IsolateNameColumn();
+  static const name = _IsolateNameColumn();
   static final number = _IsolateIDColumn();
   static final newSpace = _IsolateNewSpaceColumn();
   static final oldSpace = _IsolateOldSpaceColumn();
diff --git a/packages/devtools_app/lib/src/shared/table/table_data.dart b/packages/devtools_app/lib/src/shared/table/table_data.dart
index cf5b7ce..93baa7a 100644
--- a/packages/devtools_app/lib/src/shared/table/table_data.dart
+++ b/packages/devtools_app/lib/src/shared/table/table_data.dart
@@ -21,7 +21,7 @@
 /// The controller is expected to be alive for the duration of the app
 /// connection.
 abstract class ColumnData<T> {
-  ColumnData(
+  const ColumnData(
     this.title, {
     required double this.fixedWidthPx,
     this.titleTooltip,
@@ -30,7 +30,7 @@
     this.showTooltip = false,
   }) : minWidthPx = null;
 
-  ColumnData.wide(
+  const ColumnData.wide(
     this.title, {
     this.titleTooltip,
     this.minWidthPx,
@@ -122,7 +122,7 @@
 }
 
 abstract class TreeColumnData<T extends TreeNode<T>> extends ColumnData<T> {
-  TreeColumnData(super.title) : super.wide();
+  const TreeColumnData(super.title) : super.wide();
 
   static const treeToggleWidth = 14.0;
 
@@ -212,15 +212,15 @@
 
   static const _defaultTimeColumnWidth = 120.0;
 
-  Duration Function(T)? timeProvider;
+  final Duration Function(T)? timeProvider;
 
-  double Function(T) percentAsDoubleProvider;
+  final double Function(T) percentAsDoubleProvider;
 
-  String Function(T)? tooltipProvider;
+  final String Function(T)? tooltipProvider;
 
-  RichTooltipBuilder<T>? richTooltipProvider;
+  final RichTooltipBuilder<T>? richTooltipProvider;
 
-  Comparable Function(T)? secondaryCompare;
+  final Comparable Function(T)? secondaryCompare;
 
   final bool percentageOnly;
 
@@ -293,15 +293,15 @@
   static const _defaultMemoryColumnWidth =
       TimeAndPercentageColumn._defaultTimeColumnWidth;
 
-  int Function(T)? sizeProvider;
+  final int Function(T)? sizeProvider;
 
-  double Function(T) percentAsDoubleProvider;
+  final double Function(T) percentAsDoubleProvider;
 
-  String Function(T)? tooltipProvider;
+  final String Function(T)? tooltipProvider;
 
-  RichTooltipBuilder<T>? richTooltipProvider;
+  final RichTooltipBuilder<T>? richTooltipProvider;
 
-  Comparable Function(T)? secondaryCompare;
+  final Comparable Function(T)? secondaryCompare;
 
   final bool percentageOnly;
 
diff --git a/packages/devtools_app/lib/src/shared/ui/vm_flag_widgets.dart b/packages/devtools_app/lib/src/shared/ui/vm_flag_widgets.dart
index a1ed1de..f04b40b 100644
--- a/packages/devtools_app/lib/src/shared/ui/vm_flag_widgets.dart
+++ b/packages/devtools_app/lib/src/shared/ui/vm_flag_widgets.dart
@@ -224,9 +224,9 @@
 
   final List<_DialogFlag> flags;
 
-  static final name = _NameColumn();
-  static final description = _DescriptionColumn();
-  static final value = _ValueColumn();
+  static const name = _NameColumn();
+  static const description = _DescriptionColumn();
+  static const value = _ValueColumn();
   static final columns = <ColumnData<_DialogFlag>>[name, description, value];
 
   @override
@@ -245,14 +245,14 @@
 }
 
 class _NameColumn extends ColumnData<_DialogFlag> {
-  _NameColumn() : super('Name', fixedWidthPx: 180);
+  const _NameColumn() : super('Name', fixedWidthPx: 180);
 
   @override
   String getValue(_DialogFlag dataObject) => dataObject.name ?? '';
 }
 
 class _DescriptionColumn extends ColumnData<_DialogFlag> {
-  _DescriptionColumn() : super.wide('Description', minWidthPx: 100);
+  const _DescriptionColumn() : super.wide('Description', minWidthPx: 100);
 
   @override
   String getValue(_DialogFlag dataObject) => dataObject.description ?? '';
@@ -265,7 +265,7 @@
 }
 
 class _ValueColumn extends ColumnData<_DialogFlag> {
-  _ValueColumn()
+  const _ValueColumn()
     : super(
         'Value',
         fixedWidthPx: 100,
diff --git a/packages/devtools_app/test/screens/logging/logging_screen_test.dart b/packages/devtools_app/test/screens/logging/logging_screen_test.dart
index 8d2eb43..26eb88b 100644
--- a/packages/devtools_app/test/screens/logging/logging_screen_test.dart
+++ b/packages/devtools_app/test/screens/logging/logging_screen_test.dart
@@ -206,7 +206,7 @@
       late MessageColumn column;
 
       setUp(() {
-        column = MessageColumn();
+        column = const MessageColumn();
       });
 
       test('compare sorts logs correctly', () {
diff --git a/packages/devtools_app/test/screens/network/network_table_test.dart b/packages/devtools_app/test/screens/network/network_table_test.dart
index 7f37e56..e9191c3 100644
--- a/packages/devtools_app/test/screens/network/network_table_test.dart
+++ b/packages/devtools_app/test/screens/network/network_table_test.dart
@@ -65,14 +65,14 @@
     });
 
     test('MethodColumn', () {
-      final column = MethodColumn();
+      const column = MethodColumn();
       for (final request in requests) {
         expect(column.getDisplayValue(request), request.method);
       }
     });
 
     test('StatusColumn for http request', () {
-      final column = StatusColumn();
+      const column = StatusColumn();
       final getRequest = findRequestById('1');
       expect(column.getDisplayValue(getRequest), httpGet.status);
 
@@ -81,14 +81,14 @@
     });
 
     test('TypeColumn for http request', () {
-      final column = TypeColumn();
+      const column = TypeColumn();
       final getRequest = findRequestById('1');
 
       expect(column.getDisplayValue(getRequest), 'json');
     });
 
     test('DurationColumn for http request', () {
-      final column = DurationColumn();
+      const column = DurationColumn();
       final getRequest = findRequestById('1');
 
       expect(column.getDisplayValue(getRequest), '811 ms');