anchor.diff:      Map<int, Widget> builtChildren = new Map<int, Widget>();
   
       final List<double> offsets = layoutState._childOffsets;
  -    final Map<_Key, Widget> childrenByKey = layoutState._childrenByKey;
  +    final Map<_Key, Widget> childrenByKey = _childrenByKey;
       double extent;
       if (direction == ScrollDirection.vertical) {
         extent = constraints.maxHeight;
  
positive.code:     assert(newWidget != null);
      assert(newWidget.key != null);
      final _Key key = new _Key.fromWidget(newWidget);
      Widget oldWidget = layoutState._childrenByKey[key];
      newWidget = syncChild(newWidget, oldWidget, _omit);
      assert(newWidget != null);
      // Update the offsets based on the newWidget's dimensions.
  
negative.code:   Object token;
    MixedViewportLayoutState layoutState;
  
    Map<_Key, Widget> _childrenByKey = new Map<_Key, Widget>();
  
    // we don't pass the direction or offset to the render object when we create it, because
    // the render object is empty so it will not matter
    RenderBlockViewport get renderObject => super.renderObject;
  
    RenderBlockViewport createNode() {
      RenderBlockViewport result = new RenderBlockViewport();
      result.callback = layout;
      result.totalExtentCallback = _noIntrinsicDimensions;
      result.maxCrossAxisDimensionCallback = _noIntrinsicDimensions;
      result.minCrossAxisDimensionCallback = _noIntrinsicDimensions;
      return result;
    }
  
    void remove() {
      renderObject.callback = null;
      renderObject.totalExtentCallback = null;
      renderObject.maxCrossAxisDimensionCallback = null;
      renderObject.minCrossAxisDimensionCallback = null;
      super.remove();
      _childrenByKey.clear();
      layoutState._dirty = true;
    }
  
    void walkChildren(WidgetTreeWalker walker) {
      for (Widget child in _childrenByKey.values)
        walker(child);
    }
  
  