Chromium Code Reviews| Index: sky/sdk/lib/widgets/variable_height_scrollable.dart |
| diff --git a/sky/sdk/lib/widgets/variable_height_scrollable.dart b/sky/sdk/lib/widgets/variable_height_scrollable.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..3e94683000f4c9d53f644a1318e99199f61a9ba5 |
| --- /dev/null |
| +++ b/sky/sdk/lib/widgets/variable_height_scrollable.dart |
| @@ -0,0 +1,69 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +import 'dart:collection'; |
| + |
| +import '../animation/scroll_behavior.dart'; |
| +import 'basic.dart'; |
| +import 'block_viewport.dart'; |
| +import 'scrollable.dart'; |
| +import 'widget.dart'; |
| + |
| +class VariableHeightScrollable extends Scrollable { |
| + VariableHeightScrollable({ |
| + String key, |
| + this.builder, |
| + this.token |
| + }) : super(key: key); |
| + |
| + IndexedBuilder builder; |
| + Object token; |
| + |
| + void syncFields(VariableHeightScrollable source) { |
| + builder = source.builder; |
| + token = source.token; |
| + super.syncFields(source); |
| + } |
| + |
| + ScrollBehavior createScrollBehavior() => new OverscrollBehavior(); |
| + OverscrollBehavior get scrollBehavior => super.scrollBehavior; |
| + |
| + void _handleSizeChanged(Size newSize) { |
| + setState(() { |
| + scrollBehavior.containerHeight = newSize.height; |
| + }); |
| + } |
| + |
| + void _handleLayoutChanged( |
| + int firstVisibleWidgetIndex, |
| + int visibleWidgetCount, |
| + UnmodifiableListView<double> widgetOffsets, |
| + bool lastWidgetReached) { |
| + assert(widgetOffsets.length > 0); |
| + |
| + scrollBehavior.contentsHeight = lastWidgetReached ? widgetOffsets.last : null; |
| + |
| + // We don't know the height of all items yet. Grow the ScrollBehavior's |
|
Hixie
2015/07/10 22:51:38
delete comment-out code
hansmuller
2015/07/10 23:42:06
Done.
|
| + // contentsHeight a little, to accomodate scrolling further. |
| + /* |
| + if (!lastWidgetReached) |
| + scrollBehavior.contentsHeight += scrollBehavior.containerHeight; |
| + */ |
| + |
| + if (lastWidgetReached && scrollOffset > scrollBehavior.maxScrollOffset) |
| + settleScrollOffset(); |
| + } |
| + |
| + Widget buildContent() { |
| + return new SizeObserver( |
| + callback: _handleSizeChanged, |
| + child: new BlockViewport( |
| + builder: builder, |
| + onLayoutChanged: _handleLayoutChanged, |
| + startOffset: scrollOffset, |
| + token: token |
| + ) |
| + ); |
| + } |
| +} |