TTableHeader<T, K>.keyValues constructor

TTableHeader<T, K>.keyValues(
  1. String text,
  2. List<TKeyValue> builder(
    1. T
    ), {
  3. int? flex,
  4. double? minWidth,
  5. double? maxWidth,
  6. Alignment? alignment,
  7. bool inline = true,
  8. double spacing = 4.0,
  9. TextStyle? keyStyle,
  10. TextStyle? valueStyle,
  11. bool flattenOnMobile = true,
  12. String mobileKeyPrefixBuilder(
    1. String headerText,
    2. String childKey
    )?,
  13. String? key,
  14. TFilterType? filterType,
  15. bool filterable = false,
  16. List<TFilterOperator>? filterOperators,
  17. List? filterItems,
  18. TFilterDef<T>? filterDef,
  19. double widthEstimator(
    1. 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,
                  ),
              ],
            ],
          ],
        );
      });