TTableHeader<T, K>.keyValues constructor
TTableHeader<T, K>.keyValues (
- String text,
- List<
TKeyValue> builder(- T
- int? flex,
- double? minWidth,
- double? maxWidth,
- Alignment? alignment,
- bool inline = true,
- double spacing = 4.0,
- TextStyle? keyStyle,
- TextStyle? valueStyle,
- bool flattenOnMobile = true,
- String mobileKeyPrefixBuilder()?,
- String? key,
- TFilterType? filterType,
- bool filterable = false,
- List<
TFilterOperator> ? filterOperators, - List? filterItems,
- TFilterDef<
T> ? filterDef, - double widthEstimator(
- T data
Creates a header for displaying key-value pairs in table cells.
Implementation
TTableHeader.keyValues(
this.text,
List<TKeyValue> Function(T) builder, {
this.flex,
this.minWidth,
this.maxWidth,
this.alignment,
bool inline = true,
double spacing = 4.0,
TextStyle? keyStyle,
TextStyle? valueStyle,
this.flattenOnMobile = true,
this.mobileKeyPrefixBuilder,
this.key,
this.filterType,
this.filterable = false,
this.filterOperators,
this.filterItems,
this.filterDef,
double Function(T data)? widthEstimator,
}) : map = null,
keyValuesBuilder = builder,
widthEstimator = widthEstimator ??
((data) {
final items = builder(data);
if (items.isEmpty) return 0.0;
final effectiveKeyStyle = keyStyle ??
TTableTheme.fallbackTextStyle.adjust(
sizeMultiplier: 0.8,
weightStep: 1,
);
final effectiveValueStyle = valueStyle ?? TTableTheme.fallbackTextStyle;
double maxWidth = 0.0;
for (int i = 0; i < items.length; i++) {
final item = items[i];
final keyText = inline ? '${item.key}: ' : item.key;
final valText = item.value ?? '—';
final keyWidth = TTableTheme.measureTextWidth(keyText, effectiveKeyStyle);
final valWidth = TTableTheme.measureTextWidth(valText, effectiveValueStyle);
final iconWidth = item.icon != null ? 20.0 : 0.0;
final rowWidth = inline ? (iconWidth + keyWidth + valWidth) : math.max(iconWidth + keyWidth, valWidth);
if (rowWidth > maxWidth) maxWidth = rowWidth;
}
return maxWidth;
}),
builder = ((ctx, item, __) {
final scope = TTableScope.maybeOf(ctx);
final isDense = scope?.dense ?? false;
final items = builder(item.data);
if (items.isEmpty) return const SizedBox.shrink();
final defaultValueStyle = scope?.contentTextStyle ?? ctx.theme.tableTheme.rowCardTheme.contentTextStyle;
final defaultKeyStyle = defaultValueStyle?.adjust(
sizeMultiplier: 0.8,
color: defaultValueStyle.color?.adaptiveContrast(ctx, -0.35),
weightStep: 1,
);
final effectiveSpacing = isDense ? spacing * 0.75 : spacing;
return Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
for (int i = 0; i < items.length; i++) ...[
if (i > 0) SizedBox(height: effectiveSpacing),
if (inline)
Row(
mainAxisSize: MainAxisSize.min,
children: [
if (items[i].icon != null) ...[
items[i].icon!,
const SizedBox(width: 4),
],
Text(
'${items[i].key}: ',
style: keyStyle ?? defaultKeyStyle,
),
if (items[i].widget != null)
Flexible(child: items[i].widget!)
else
Flexible(
child: Text(
items[i].value ?? '—',
style: valueStyle ?? defaultValueStyle,
overflow: TextOverflow.ellipsis,
),
),
],
)
else ...[
Text(
items[i].key,
style: keyStyle ?? defaultKeyStyle,
),
if (items[i].widget != null)
items[i].widget!
else
Text(
items[i].value ?? '—',
style: valueStyle ?? defaultValueStyle,
),
],
],
],
);
});