From d2a1389ed01aecbb7098104b86aa51e1abf24a5e Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Wed, 6 Jan 2016 10:44:19 -0800 Subject: [PATCH] Fix assert in Stocks app When paging a scrollable list, we were trying to read the render object's size at a time when we're not allowed to read it. Instead, encode the information into the repaint limit, which is more correct (and faster) anyway. --- packages/flutter/lib/src/widgets/scrollable_grid.dart | 2 +- packages/flutter/lib/src/widgets/scrollable_list.dart | 2 +- .../flutter/lib/src/widgets/virtual_viewport.dart | 11 +---------- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/packages/flutter/lib/src/widgets/scrollable_grid.dart b/packages/flutter/lib/src/widgets/scrollable_grid.dart index 5076a00637..850cc54f43 100644 --- a/packages/flutter/lib/src/widgets/scrollable_grid.dart +++ b/packages/flutter/lib/src/widgets/scrollable_grid.dart @@ -142,7 +142,7 @@ class _GridViewportElement extends VirtualViewportElement { _materializedChildBase = (materializedRowBase * _specification.columnCount).clamp(0, renderObject.virtualChildCount); _materializedChildCount = (materializedRowLimit * _specification.columnCount).clamp(0, renderObject.virtualChildCount) - _materializedChildBase; _repaintOffsetBase = _specification.rowOffsets[materializedRowBase]; - _repaintOffsetLimit = _specification.rowOffsets[materializedRowLimit]; + _repaintOffsetLimit = _specification.rowOffsets[materializedRowLimit] - containerExtent; super.layout(constraints); diff --git a/packages/flutter/lib/src/widgets/scrollable_list.dart b/packages/flutter/lib/src/widgets/scrollable_list.dart index e3a54a688f..36d7ab25d2 100644 --- a/packages/flutter/lib/src/widgets/scrollable_list.dart +++ b/packages/flutter/lib/src/widgets/scrollable_list.dart @@ -170,7 +170,7 @@ class _ListViewportElement extends VirtualViewportElement { _materializedChildCount = materializedChildLimit - _materializedChildBase; _repaintOffsetBase = _materializedChildBase * widget.itemExtent; - _repaintOffsetLimit = materializedChildLimit * widget.itemExtent; + _repaintOffsetLimit = materializedChildLimit * widget.itemExtent - containerExtent; super.layout(constraints); diff --git a/packages/flutter/lib/src/widgets/virtual_viewport.dart b/packages/flutter/lib/src/widgets/virtual_viewport.dart index 18ccbe5bc9..5898faf4d9 100644 --- a/packages/flutter/lib/src/widgets/virtual_viewport.dart +++ b/packages/flutter/lib/src/widgets/virtual_viewport.dart @@ -69,15 +69,6 @@ abstract class VirtualViewportElement extends RenderO } } - double get _containerExtent { - switch (widget.scrollDirection) { - case ScrollDirection.vertical: - return renderObject.size.height; - case ScrollDirection.horizontal: - return renderObject.size.width; - } - } - void updateRenderObject() { renderObject.virtualChildCount = widget.children.length; @@ -89,7 +80,7 @@ abstract class VirtualViewportElement extends RenderO if (!renderObject.needsLayout) { if (repaintOffsetBase != null && widget.startOffset < repaintOffsetBase) renderObject.markNeedsLayout(); - else if (repaintOffsetLimit != null && widget.startOffset + _containerExtent > repaintOffsetLimit) + else if (repaintOffsetLimit != null && widget.startOffset > repaintOffsetLimit) renderObject.markNeedsLayout(); } }