update method

  1. @override
void update()
override

Call the setItemSize callback while traversing the items list.

Implementation

@override
void update() {
  final length = items.length;

  double effectiveMaxSize = maxSize;

  double totalWidth = items.fold<double>(0, (p, e) => p += getItemSize(e));

  double scale = maxSize / totalWidth;

  bool isSuppressed(T e) {
    return isSuppressedItem(e) || getItemSize(e) * scale < getItemMinSize(e);
  }

  final suppressedItems = items.where(isSuppressed);

  if (suppressedItems.isNotEmpty) {
    final totalSuppressedSize = suppressedItems.fold<double>(0, (p, e) {
      return p + (isSuppressedItem(e) ? getItemSize(e) : getItemMinSize(e));
    });

    effectiveMaxSize = maxSize - totalSuppressedSize;

    totalWidth = items.whereNot(isSuppressed).fold(0, (p, e) {
      return p + getItemSize(e);
    });

    scale = effectiveMaxSize / totalWidth;
  }

  for (int i = 0; i < length; i += 1) {
    final item = items.elementAt(i);

    if (isSuppressedItem(item)) continue;

    final minSize = getItemMinSize(item);

    final size = max(minSize, getItemSize(item) * scale);

    setItemSize(item, size);
  }
}