TTableHeader<T, K>.chips constructor
TTableHeader<T, K>.chips (
- String text,
- List<
TChip> builder(- T
- int? flex,
- double? minWidth,
- double? maxWidth,
- Alignment? alignment,
- Color? color(
- T data,
- String chipText
- dynamic icon(
- T data,
- String chipText
- TVariant? type,
- TVariant? typeBuilder(
- T data,
- String chipText
- TSize size = TChipSize.sm,
- double spacing = 4.0,
- double runSpacing = 4.0,
- WrapCrossAlignment crossAxisAlignment = WrapCrossAlignment.center,
- WrapAlignment wrapAlignment = WrapAlignment.start,
- void Function(String chipText)? onTap(
- T data
- String? key,
- TFilterType? filterType,
- bool filterable = false,
- List<
TFilterOperator> ? filterOperators, - List? filterItems,
- TFilterDef<
T> ? filterDef, - double widthEstimator(
- T data
- bool flattenOnMobile = false,
- String mobileKeyPrefixBuilder()?,
- List<
TKeyValue> keyValuesBuilder(- T data
Creates a header for displaying multiple chips in a Wrap with auto-calculated width estimation.
Each TChip can define its own visual attributes (TChip.solid, TChip.tonal, TChip.outline,
TChip.softOutline, TChip.text, custom TChip.icon, TChip.color, TChip.onTap).
Any properties omitted on individual chips automatically inherit the common header configuration
(type, color, size, spacing, runSpacing).
Implementation
TTableHeader.chips(
this.text,
List<TChip> Function(T) builder, {
this.flex,
this.minWidth,
this.maxWidth,
this.alignment,
Color? Function(T data, String chipText)? color,
dynamic Function(T data, String chipText)? icon,
TVariant? type,
TVariant? Function(T data, String chipText)? typeBuilder,
TSize size = TChipSize.sm,
double spacing = 4.0,
double runSpacing = 4.0,
WrapCrossAlignment crossAxisAlignment = WrapCrossAlignment.center,
WrapAlignment wrapAlignment = WrapAlignment.start,
void Function(String chipText)? Function(T data)? onTap,
this.key,
this.filterType,
this.filterable = false,
this.filterOperators,
this.filterItems,
this.filterDef,
double Function(T data)? widthEstimator,
this.flattenOnMobile = false,
this.mobileKeyPrefixBuilder,
this.keyValuesBuilder,
}) : map = ((data) => builder(data).map((c) => c.text).where((s) => s != null && s.isNotEmpty).join(', ')),
widthEstimator = widthEstimator ??
((data) {
final items = builder(data);
if (items.isEmpty) return 0.0;
double totalWidth = 0.0;
for (int i = 0; i < items.length; i++) {
final chip = items[i];
final text = chip.text ?? '';
final hasIcon = chip.icon != null || (icon != null && icon(data, text) != null);
final hasTrailing = chip.trailing != null;
final textWidth = text.isNotEmpty ? TTableTheme.measureTextWidth(text) : 0.0;
final iconWidth = hasIcon ? 18.0 : 0.0;
final trailingWidth = hasTrailing ? 18.0 : 0.0;
totalWidth += textWidth + 24.0 + iconWidth + trailingWidth;
}
if (items.length > 1) {
totalWidth += (items.length - 1) * spacing;
}
return totalWidth;
}),
builder = ((ctx, item, __) {
final isDense = TTableScope.maybeOf(ctx)?.dense ?? false;
final items = builder(item.data);
if (items.isEmpty) return const SizedBox.shrink();
final effectiveSpacing = isDense ? spacing * 0.75 : spacing;
final effectiveRunSpacing = isDense ? runSpacing * 0.75 : runSpacing;
return Wrap(
spacing: effectiveSpacing,
runSpacing: effectiveRunSpacing,
crossAxisAlignment: crossAxisAlignment,
alignment: wrapAlignment,
children: [
for (final chip in items)
TChip(
key: chip.key,
text: chip.text,
icon: chip.icon ?? icon?.call(item.data, chip.text ?? ''),
trailing: chip.trailing,
color: chip.color ?? color?.call(item.data, chip.text ?? ''),
background: chip.background,
textColor: chip.textColor,
type: chip.type ?? typeBuilder?.call(item.data, chip.text ?? '') ?? type,
size: chip.size != TChipSize.md ? chip.size : size,
onTap: chip.onTap ?? (onTap?.call(item.data) != null ? () => onTap!(item.data)!(chip.text ?? '') : null),
padding: isDense ? const EdgeInsets.symmetric(horizontal: 6, vertical: 2) : chip.padding,
borderRadius: chip.borderRadius,
),
],
);
});