childCount property

  1. @override
int childCount
override

Called to obtain a precise measure of the total number of children.

Must return the number that is one greater than the greatest index for which createChild will actually create a child.

This is used when createChild cannot add a child for a positive index, to determine the precise dimensions of the sliver. It must return an accurate and precise non-null value. It will not be called if createChild is always able to create a child (e.g. for an infinite list).

Implementation

@override
int get childCount {
  int? result = estimatedChildCount;
  if (result == null) {
    // Since childCount was called, we know that we reached the end of
    // the list (as in, _build return null once), so we know that the
    // list is finite.
    // Let's do an open-ended binary search to find the end of the list
    // manually.
    int lo = 0;
    int hi = 1;
    final SliverMultiBoxAdaptorWidget adaptorWidget = widget as SliverMultiBoxAdaptorWidget;
    const int max = kIsWeb
      ? 9007199254740992 // max safe integer on JS (from 0 to this number x != x+1)
      : ((1 << 63) - 1);
    while (_build(hi - 1, adaptorWidget) != null) {
      lo = hi - 1;
      if (hi < max ~/ 2) {
        hi *= 2;
      } else if (hi < max) {
        hi = max;
      } else {
        throw FlutterError(
          'Could not find the number of children in ${adaptorWidget.delegate}.\n'
          "The childCount getter was called (implying that the delegate's builder returned null "
          'for a positive index), but even building the child with index $hi (the maximum '
          'possible integer) did not return null. Consider implementing childCount to avoid '
          'the cost of searching for the final child.',
        );
      }
    }
    while (hi - lo > 1) {
      final int mid = (hi - lo) ~/ 2 + lo;
      if (_build(mid - 1, adaptorWidget) == null) {
        hi = mid;
      } else {
        lo = mid;
      }
    }
    result = lo;
  }
  return result;
}