diff --git a/packages/flutter/lib/src/widgets/sliver.dart b/packages/flutter/lib/src/widgets/sliver.dart index 64cdec6f5f..b206b3dcd3 100644 --- a/packages/flutter/lib/src/widgets/sliver.dart +++ b/packages/flutter/lib/src/widgets/sliver.dart @@ -577,13 +577,20 @@ class SliverMultiBoxAdaptorElement extends RenderObjectElement implements Render performRebuild(); } - final SplayTreeMap _childElements = new SplayTreeMap(); + // We inflate widgets at two different times: + // 1. When we ourselves are told to rebuild (see performRebuild). + // 2. When our render object needs a new child (see createChild). + // In both cases, we cache the results of calling into our delegate to get the widget, + // so that if we do case 2 later, we don't call the builder again. + // Any time we do case 1, though, we reset the cache. + final Map _childWidgets = new HashMap(); + final SplayTreeMap _childElements = new SplayTreeMap(); RenderBox _currentBeforeChild; @override void performRebuild() { - _childWidgets.clear(); + _childWidgets.clear(); // Reset the cache, as described above. super.performRebuild(); _currentBeforeChild = null; assert(_currentlyUpdatingChildIndex == null); @@ -596,9 +603,6 @@ class SliverMultiBoxAdaptorElement extends RenderObjectElement implements Render } else if (_didUnderflow) { lastIndex += 1; } - // We won't call the delegate's build function multiple times, because we - // cache the delegate's results until the next time we need to rebuild the - // whole widget. for (int index = firstIndex; index <= lastIndex; ++index) { _currentlyUpdatingChildIndex = index; final Element newChild = updateChild(_childElements[index], _build(index), index);