performLayout method
Override this method to lay out and position all children given this widget's size.
This method must call layoutChild for each child. It should also specify the final position of each child with positionChild.
Implementation
@override
void performLayout(Size size) {
// Separate columns into pinned and unpinned
final pinnedColumns = columns.where((c) => c.pinned && c.visible).toList();
final unpinnedColumns = columns.where((c) => !c.pinned && c.visible).toList();
final pinnedWidth = pinnedColumns.fold<double>(0, (sum, c) => sum + c.width);
// PHASE 1: Layout pinned columns at fixed positions (no scroll offset)
double offsetX = 0;
for (var column in pinnedColumns) {
if (hasChild(column.id)) {
layoutChild(column.id, BoxConstraints.tightFor(width: column.width, height: size.height));
positionChild(column.id, Offset(offsetX, 0));
offsetX += column.width;
}
}
// PHASE 2: Layout unpinned columns with scroll offset
offsetX = pinnedWidth - horizontalOffset;
for (var column in unpinnedColumns) {
if (hasChild(column.id)) {
layoutChild(column.id, BoxConstraints.tightFor(width: column.width, height: size.height));
positionChild(column.id, Offset(offsetX, 0));
offsetX += column.width;
}
}
}