Add an onScroll callback to Scrollable
This commit is contained in:
parent
a765507c9d
commit
ff5676952e
@ -21,7 +21,7 @@ const double _kMillisecondsPerSecond = 1000.0;
|
|||||||
const double _kMinFlingVelocity = -kMaxFlingVelocity * _kMillisecondsPerSecond;
|
const double _kMinFlingVelocity = -kMaxFlingVelocity * _kMillisecondsPerSecond;
|
||||||
const double _kMaxFlingVelocity = kMaxFlingVelocity * _kMillisecondsPerSecond;
|
const double _kMaxFlingVelocity = kMaxFlingVelocity * _kMillisecondsPerSecond;
|
||||||
|
|
||||||
typedef void ScrollListener();
|
typedef void ScrollListener(double scrollOffset);
|
||||||
|
|
||||||
/// A base class for scrollable widgets that reacts to user input and generates
|
/// A base class for scrollable widgets that reacts to user input and generates
|
||||||
/// a scrollOffset.
|
/// a scrollOffset.
|
||||||
@ -29,7 +29,8 @@ abstract class Scrollable extends StatefulComponent {
|
|||||||
Scrollable({
|
Scrollable({
|
||||||
Key key,
|
Key key,
|
||||||
this.initialScrollOffset,
|
this.initialScrollOffset,
|
||||||
this.scrollDirection: ScrollDirection.vertical
|
this.scrollDirection: ScrollDirection.vertical,
|
||||||
|
this.onScroll
|
||||||
}) : super(key: key) {
|
}) : super(key: key) {
|
||||||
assert(scrollDirection == ScrollDirection.vertical ||
|
assert(scrollDirection == ScrollDirection.vertical ||
|
||||||
scrollDirection == ScrollDirection.horizontal);
|
scrollDirection == ScrollDirection.horizontal);
|
||||||
@ -37,6 +38,7 @@ abstract class Scrollable extends StatefulComponent {
|
|||||||
|
|
||||||
final double initialScrollOffset;
|
final double initialScrollOffset;
|
||||||
final ScrollDirection scrollDirection;
|
final ScrollDirection scrollDirection;
|
||||||
|
final ScrollListener onScroll;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class ScrollableState<T extends Scrollable> extends State<T> {
|
abstract class ScrollableState<T extends Scrollable> extends State<T> {
|
||||||
@ -136,8 +138,8 @@ abstract class ScrollableState<T extends Scrollable> extends State<T> {
|
|||||||
setState(() {
|
setState(() {
|
||||||
_scrollOffset = newScrollOffset;
|
_scrollOffset = newScrollOffset;
|
||||||
});
|
});
|
||||||
if (_listeners.length > 0)
|
if (config.onScroll != null)
|
||||||
_notifyListeners();
|
config.onScroll(_scrollOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future scrollTo(double newScrollOffset, { Duration duration, Curve curve: ease }) {
|
Future scrollTo(double newScrollOffset, { Duration duration, Curve curve: ease }) {
|
||||||
@ -190,21 +192,6 @@ abstract class ScrollableState<T extends Scrollable> extends State<T> {
|
|||||||
void _handleDragEnd(Offset velocity) {
|
void _handleDragEnd(Offset velocity) {
|
||||||
fling(velocity);
|
fling(velocity);
|
||||||
}
|
}
|
||||||
|
|
||||||
final List<ScrollListener> _listeners = new List<ScrollListener>();
|
|
||||||
void addListener(ScrollListener listener) {
|
|
||||||
_listeners.add(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
void removeListener(ScrollListener listener) {
|
|
||||||
_listeners.remove(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _notifyListeners() {
|
|
||||||
List<ScrollListener> localListeners = new List<ScrollListener>.from(_listeners);
|
|
||||||
for (ScrollListener listener in localListeners)
|
|
||||||
listener();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ScrollableState findScrollableAncestor(BuildContext context) {
|
ScrollableState findScrollableAncestor(BuildContext context) {
|
||||||
@ -271,11 +258,13 @@ class ScrollableViewport extends Scrollable {
|
|||||||
Key key,
|
Key key,
|
||||||
this.child,
|
this.child,
|
||||||
double initialScrollOffset,
|
double initialScrollOffset,
|
||||||
ScrollDirection scrollDirection: ScrollDirection.vertical
|
ScrollDirection scrollDirection: ScrollDirection.vertical,
|
||||||
|
ScrollListener onScroll
|
||||||
}) : super(
|
}) : super(
|
||||||
key: key,
|
key: key,
|
||||||
scrollDirection: scrollDirection,
|
scrollDirection: scrollDirection,
|
||||||
initialScrollOffset: initialScrollOffset
|
initialScrollOffset: initialScrollOffset,
|
||||||
|
onScroll: onScroll
|
||||||
);
|
);
|
||||||
|
|
||||||
final Widget child;
|
final Widget child;
|
||||||
@ -332,12 +321,14 @@ class Block extends StatelessComponent {
|
|||||||
Block(this.children, {
|
Block(this.children, {
|
||||||
Key key,
|
Key key,
|
||||||
this.initialScrollOffset,
|
this.initialScrollOffset,
|
||||||
this.scrollDirection: ScrollDirection.vertical
|
this.scrollDirection: ScrollDirection.vertical,
|
||||||
|
this.onScroll
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
final List<Widget> children;
|
final List<Widget> children;
|
||||||
final double initialScrollOffset;
|
final double initialScrollOffset;
|
||||||
final ScrollDirection scrollDirection;
|
final ScrollDirection scrollDirection;
|
||||||
|
final ScrollListener onScroll;
|
||||||
|
|
||||||
BlockDirection get _direction {
|
BlockDirection get _direction {
|
||||||
if (scrollDirection == ScrollDirection.vertical)
|
if (scrollDirection == ScrollDirection.vertical)
|
||||||
@ -349,6 +340,7 @@ class Block extends StatelessComponent {
|
|||||||
return new ScrollableViewport(
|
return new ScrollableViewport(
|
||||||
initialScrollOffset: initialScrollOffset,
|
initialScrollOffset: initialScrollOffset,
|
||||||
scrollDirection: scrollDirection,
|
scrollDirection: scrollDirection,
|
||||||
|
onScroll: onScroll,
|
||||||
child: new BlockBody(children, direction: _direction)
|
child: new BlockBody(children, direction: _direction)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -364,10 +356,16 @@ abstract class ScrollableWidgetList extends Scrollable {
|
|||||||
Key key,
|
Key key,
|
||||||
double initialScrollOffset,
|
double initialScrollOffset,
|
||||||
ScrollDirection scrollDirection: ScrollDirection.vertical,
|
ScrollDirection scrollDirection: ScrollDirection.vertical,
|
||||||
|
ScrollListener onScroll,
|
||||||
this.itemsWrap: false,
|
this.itemsWrap: false,
|
||||||
this.itemExtent,
|
this.itemExtent,
|
||||||
this.padding
|
this.padding
|
||||||
}) : super(key: key, initialScrollOffset: initialScrollOffset, scrollDirection: scrollDirection) {
|
}) : super(
|
||||||
|
key: key,
|
||||||
|
initialScrollOffset: initialScrollOffset,
|
||||||
|
scrollDirection: scrollDirection,
|
||||||
|
onScroll: onScroll
|
||||||
|
) {
|
||||||
assert(itemExtent != null);
|
assert(itemExtent != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -499,6 +497,7 @@ class ScrollableList<T> extends ScrollableWidgetList {
|
|||||||
Key key,
|
Key key,
|
||||||
double initialScrollOffset,
|
double initialScrollOffset,
|
||||||
ScrollDirection scrollDirection: ScrollDirection.vertical,
|
ScrollDirection scrollDirection: ScrollDirection.vertical,
|
||||||
|
ScrollListener onScroll,
|
||||||
this.items,
|
this.items,
|
||||||
this.itemBuilder,
|
this.itemBuilder,
|
||||||
itemsWrap: false,
|
itemsWrap: false,
|
||||||
@ -508,6 +507,7 @@ class ScrollableList<T> extends ScrollableWidgetList {
|
|||||||
key: key,
|
key: key,
|
||||||
initialScrollOffset: initialScrollOffset,
|
initialScrollOffset: initialScrollOffset,
|
||||||
scrollDirection: scrollDirection,
|
scrollDirection: scrollDirection,
|
||||||
|
onScroll: onScroll,
|
||||||
itemsWrap: itemsWrap,
|
itemsWrap: itemsWrap,
|
||||||
itemExtent: itemExtent,
|
itemExtent: itemExtent,
|
||||||
padding: padding);
|
padding: padding);
|
||||||
@ -542,6 +542,7 @@ class PageableList<T> extends ScrollableList<T> {
|
|||||||
Key key,
|
Key key,
|
||||||
double initialScrollOffset,
|
double initialScrollOffset,
|
||||||
ScrollDirection scrollDirection: ScrollDirection.horizontal,
|
ScrollDirection scrollDirection: ScrollDirection.horizontal,
|
||||||
|
ScrollListener onScroll,
|
||||||
List<T> items,
|
List<T> items,
|
||||||
ItemBuilder<T> itemBuilder,
|
ItemBuilder<T> itemBuilder,
|
||||||
bool itemsWrap: false,
|
bool itemsWrap: false,
|
||||||
@ -554,6 +555,7 @@ class PageableList<T> extends ScrollableList<T> {
|
|||||||
key: key,
|
key: key,
|
||||||
initialScrollOffset: initialScrollOffset,
|
initialScrollOffset: initialScrollOffset,
|
||||||
scrollDirection: scrollDirection,
|
scrollDirection: scrollDirection,
|
||||||
|
onScroll: onScroll,
|
||||||
items: items,
|
items: items,
|
||||||
itemBuilder: itemBuilder,
|
itemBuilder: itemBuilder,
|
||||||
itemsWrap: itemsWrap,
|
itemsWrap: itemsWrap,
|
||||||
@ -606,10 +608,15 @@ class ScrollableMixedWidgetList extends Scrollable {
|
|||||||
ScrollableMixedWidgetList({
|
ScrollableMixedWidgetList({
|
||||||
Key key,
|
Key key,
|
||||||
double initialScrollOffset,
|
double initialScrollOffset,
|
||||||
|
ScrollListener onScroll,
|
||||||
this.builder,
|
this.builder,
|
||||||
this.token,
|
this.token,
|
||||||
this.onInvalidatorAvailable
|
this.onInvalidatorAvailable
|
||||||
}) : super(key: key, initialScrollOffset: initialScrollOffset);
|
}) : super(
|
||||||
|
key: key,
|
||||||
|
initialScrollOffset: initialScrollOffset,
|
||||||
|
onScroll: onScroll
|
||||||
|
);
|
||||||
|
|
||||||
final IndexedBuilder builder;
|
final IndexedBuilder builder;
|
||||||
final Object token;
|
final Object token;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user