computeItemBox method
Rect?
computeItemBox(
- int itemIndex,
- bool absolute,
- bool avoidMeasuring
)
override
Implementation
@override
Rect? computeItemBox(int itemIndex, bool absolute, bool avoidMeasuring) {
if (intervalManager.hasPendingUpdates) return null;
final interval = intervalManager.list.intervalAtItemIndex(itemIndex);
if (interval is! _NormalInterval && interval is! _ReadyToChangingInterval) {
return null;
}
var buildIndex = interval.buildOffset + (itemIndex - interval.itemOffset);
assert(!intervalManager.hasPendingUpdates);
if (buildIndex < 0 || buildIndex >= intervalManager.list.buildCount) {
return null;
}
var r = 0.0;
var s = 0.0;
if (firstChild == null) {
if (avoidMeasuring) return null;
for (var i = 0; i < buildIndex; i++) {
final widget = childManager.build(i, measureOnly: true);
if (widget == null) return null;
r += measureItem(widget);
}
final widget = childManager.build(buildIndex, measureOnly: true);
if (widget == null) return null;
s = measureItem(widget);
} else {
s = paintExtentOf(firstChild!);
final parentData = parentDataOf(firstChild)!;
var i = parentData.index!;
r = parentData.layoutOffset!;
if (buildIndex <= i) {
if (avoidMeasuring && buildIndex < i) return null;
while (buildIndex < i) {
final widget = childManager.build(--i, measureOnly: true);
if (widget == null) return null;
s = measureItem(widget);
r -= s;
}
} else {
var child = firstChild;
while (buildIndex > i) {
final nextChild = childAfter(child!);
if (nextChild == null) break;
final parentData = parentDataOf(nextChild)!;
if (parentData.layoutOffset == null) break;
child = nextChild;
i = parentData.index!;
r = parentData.layoutOffset!;
}
s = paintExtentOf(child!);
if (buildIndex > i) {
if (avoidMeasuring) return null;
i++;
r += s;
while (buildIndex > i) {
final widget = childManager.build(i++, measureOnly: true);
if (widget == null) return null;
r += measureItem(widget);
}
final widget = childManager.build(buildIndex, measureOnly: true);
if (widget == null) return null;
s = measureItem(widget);
}
}
}
if (absolute) {
r += constraints.precedingScrollExtent;
}
switch (constraints.axis) {
case Axis.horizontal:
return Rect.fromLTWH(r, 0, s, constraints.crossAxisExtent);
case Axis.vertical:
return Rect.fromLTWH(0, r, constraints.crossAxisExtent, s);
}
}