anchor.diff:    double _maxScrollExtent;
     bool _hasVisualOverflow = false;
   
  +  /// This value is set during layout based on the [CacheExtentStyle].
  +  ///
  +  /// When the style is [CacheExtentStyle.viewport], it is the main axis extent
  +  /// of the viewport multiplied by the requested cache extent, which is still
  +  /// expressed in pixels.
  +  double _calculatedCacheExtent;
  +
     @override
     double get anchor => _anchor;
   
  
positive.code:         growthDirection: GrowthDirection.reverse,
          advance: childBefore,
          remainingCacheExtent: reverseDirectionRemainingCacheExtent,
          cacheOrigin: (mainAxisExtent - centerOffset).clamp(-cacheExtent, 0.0),
        );
        if (result != 0.0) return -result;
      }
  
negative.code:       case Axis.horizontal:
          offset.applyViewportDimension(size.width);
          break;
      }
    }
  
    @override
    Rect describeSemanticsClip(RenderSliver child) {
      assert(axis != null);
  
      if (_calculatedCacheExtent == null) {
        return semanticBounds;
      }
  
      switch (axis) {
        case Axis.vertical:
          return Rect.fromLTRB(
            semanticBounds.left,
            semanticBounds.top - _calculatedCacheExtent,
            semanticBounds.right,
            semanticBounds.bottom + _calculatedCacheExtent,
          );
        default:
          return Rect.fromLTRB(
            semanticBounds.left - _calculatedCacheExtent,
            semanticBounds.top,
            semanticBounds.right + _calculatedCacheExtent,
            semanticBounds.bottom,
          );
      }
    }
  
  