computeItemBox method

  1. @override
Rect? computeItemBox(
  1. int itemIndex,
  2. bool absolute,
  3. 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);
  }
}