in packages/devtools_app/lib/src/shared/table.dart [1335:1462]
Widget tableRowFor(BuildContext context, {VoidCallback onPressed}) {
Widget columnFor(ColumnData<T> column, double columnWidth) {
Widget content;
final node = widget.node;
if (node == null) {
final isSortColumn = column == widget.sortColumn;
final title = Text(
column.title,
overflow: TextOverflow.ellipsis,
);
content = InkWell(
canRequestFocus: false,
onTap: () => _handleSortChange(
column,
secondarySortColumn: widget.secondarySortColumn,
),
child: Row(
mainAxisAlignment: _mainAxisAlignmentFor(column),
children: [
if (isSortColumn)
Icon(
widget.sortDirection == SortDirection.ascending
? Icons.expand_less
: Icons.expand_more,
size: defaultIconSize,
),
if (isSortColumn) const SizedBox(width: densePadding),
// TODO: This Flexible wrapper was added to get the
// network_profiler_test.dart tests to pass.
Flexible(
child: column.titleTooltip != null
? DevToolsTooltip(
message: column.titleTooltip,
padding: const EdgeInsets.all(denseSpacing),
child: title,
)
: title,
),
],
),
);
} else {
final padding = column.getNodeIndentPx(node);
assert(padding >= 0);
if (column is ColumnRenderer) {
content = (column as ColumnRenderer).build(
context,
node,
isRowSelected: widget.isSelected,
onPressed: onPressed,
);
}
content ??= Text(
column.getDisplayValue(node),
overflow: TextOverflow.ellipsis,
style: contentTextStyle(column),
maxLines: 1,
);
final tooltip = column.getTooltip(node);
if (tooltip != null && tooltip is String && tooltip.isNotEmpty) {
content = DevToolsTooltip(
message: tooltip,
waitDuration: tooltipWaitLong,
child: content,
);
}
if (column == widget.expandableColumn) {
final expandIndicator = widget.isExpandable
? RotationTransition(
turns: expandArrowAnimation,
child: Icon(
Icons.expand_more,
color: widget.isSelected
? defaultSelectionForegroundColor
: null,
size: defaultIconSize,
),
)
: SizedBox(width: defaultIconSize, height: defaultIconSize);
content = Row(
mainAxisSize: MainAxisSize.min,
children: [
expandIndicator,
Expanded(child: content),
],
);
}
content = Padding(
padding: EdgeInsets.only(left: padding),
child: ClipRect(
child: content,
),
);
}
content = SizedBox(
width: columnWidth,
child: Align(
alignment: _alignmentFor(column),
child: content,
),
);
return content;
}
return Padding(
padding: const EdgeInsets.symmetric(horizontal: defaultSpacing),
child: ListView.builder(
scrollDirection: Axis.horizontal,
controller: scrollController,
itemCount: widget.columns.length + widget.numSpacers,
itemBuilder: (context, int i) {
if (i % 2 == 1) {
return const SizedBox(width: defaultSpacing);
}
return columnFor(
widget.columns[i ~/ 2],
widget.columnWidths[i ~/ 2],
);
},
),
);
}