public IPromise ensureVisible(RenderObject renderObject, float alignment = 0.0f, TimeSpan?duration = null, Curve curve = null ) { D.assert(renderObject.attached); RenderAbstractViewport viewport = RenderViewportUtils.of(renderObject); D.assert(viewport != null); float target = viewport.getOffsetToReveal(renderObject, alignment).offset.clamp( this.minScrollExtent, this.maxScrollExtent); if (target == this.pixels) { return(Promise.Resolved()); } duration = duration ?? TimeSpan.Zero; if (duration == TimeSpan.Zero) { this.jumpTo(target); return(Promise.Resolved()); } curve = curve ?? Curves.ease; return(this.animateTo(target, duration: duration.Value, curve: curve)); }
void _scrollTo(BuildContext context) { if (this._scrolling) { return; } RenderObject contextObject = context.findRenderObject(); RenderAbstractViewport viewport = RenderViewportUtils.of(contextObject); D.assert(viewport != null); float margin = this._dropAreaExtent; float scrollOffset = this._scrollController.offset; float topOffset = Mathf.Max(this._scrollController.position.minScrollExtent, viewport.getOffsetToReveal(contextObject, 0.0f).offset - margin ); float bottomOffset = Mathf.Min(this._scrollController.position.maxScrollExtent, viewport.getOffsetToReveal(contextObject, 1.0f).offset + margin ); bool onScreen = scrollOffset <= topOffset && scrollOffset >= bottomOffset; if (!onScreen) { this._scrolling = true; this._scrollController.position.animateTo( scrollOffset < bottomOffset ? bottomOffset : topOffset, duration: this._scrollAnimationDuration, curve: Curves.easeInOut ).Then(() => { this.setState(() => { this._scrolling = false; }); }); } }
public Future ensureVisible( RenderObject renderObject, float alignment = 0.0f, TimeSpan?duration = null, Curve curve = null, ScrollPositionAlignmentPolicy alignmentPolicy = ScrollPositionAlignmentPolicy.explicitPolicy ) { D.assert(renderObject.attached); RenderAbstractViewport viewport = RenderViewportUtils.of(renderObject); D.assert(viewport != null); float target = 0f; switch (alignmentPolicy) { case ScrollPositionAlignmentPolicy.explicitPolicy: target = viewport.getOffsetToReveal(renderObject, alignment).offset.clamp(minScrollExtent, maxScrollExtent); break; case ScrollPositionAlignmentPolicy.keepVisibleAtEnd: target = viewport.getOffsetToReveal(renderObject, 1.0f).offset.clamp(minScrollExtent, maxScrollExtent); if (target < pixels) { target = pixels; } break; case ScrollPositionAlignmentPolicy.keepVisibleAtStart: target = viewport.getOffsetToReveal(renderObject, 0.0f).offset.clamp(minScrollExtent, maxScrollExtent); if (target > pixels) { target = pixels; } break; } if (foundation_.FloatEqual(target, pixels)) { return(Future.value()); } duration = duration ?? TimeSpan.Zero; if (duration == TimeSpan.Zero) { jumpTo(target); return(Future.value()); } curve = curve ?? Curves.ease; return(animateTo(target, duration: duration.Value, curve: curve)); }