Skip to main content

ScrollView

Struct ScrollView 

Source
pub struct ScrollView<State: 'static> { /* private fields */ }
Expand description

A declarative vertical scroll surface. See the module docs.

Implementations§

Source§

impl<State: 'static> ScrollView<State>

Source

pub fn new<V: View<State>>(child: V) -> Self

Wrap child in a vertical scroll view.

Source

pub fn on_scroll<F: Fn(&mut State, ScrollInfo) + 'static>( self, callback: F, ) -> Self

Observe scroll position changes. The callback receives a ScrollInfo snapshot each time the offset or overscroll changes due to input (drag, wheel), and — one event late — for fling/settle motion driven at paint time (the paint pass carries no EventCtx, so the notification is recorded and delivered on the next event, the same controlled-component convention the interactive widgets follow). A Cancel clears any pending notification without firing it.

Source

pub fn on_refresh_release<F: Fn(&mut State) + 'static>( self, callback: F, ) -> Self

The pull-to-refresh trigger: fires on pointer Up when the surface was pulled past the top by more than [REFRESH_TRIGGER_PX] (post-resistance), so an app gets a single “release past threshold” signal without reimplementing overscroll thresholding. Never fires on a Cancel.

Source

pub fn physics(self, physics: impl ScrollPhysics + 'static) -> Self

Install a custom ScrollPhysics strategy — the pluggable drag-mapping/boundary-rejection/post-release-motion contract described in crate::physics, with the platform-parity physics (crate::physics::parity’s Bouncing/Clamping/ AlwaysScrollable/NeverScrollable) and the pre-seam RubberBand as the built-in implementations.

use frust_widgets::{NeverScrollable, ScrollView, scroll_view, text};
let view: ScrollView<()> = scroll_view(text("hi")).physics(NeverScrollable::new());
§Build/rebuild semantics

A view built (or rebuilt) with .physics(...) installs it on the widget every time — like ScrollView::on_scroll’s erased callback, a trait object isn’t comparable, so this reinstalls unconditionally rather than diffing. A view built (or rebuilt) without .physics(...) leaves whatever the widget already has installed untouched: a fresh build still starts the widget at crate::physics::default_physics (the widget’s own constructor default), but rebuilding from a .physics(...)-carrying view to a plain one does not revert it — there is no spelling for “go back to the default” versus “no opinion this rebuild”, and this picks the latter, the same shape ScrollWidget::effect already followed before this method existed.

Defaults to the platform-adaptive physics (crate::physics::default_physics — Android clamping, elsewhere bouncing) if never called; .physics(RubberBand::new()) is how an app asks for the pre-seam rubber-band feel instead.

Source

pub fn overscroll_effect(self, effect: OverscrollEffect) -> Self

Select how past-edge pull is visualized. See OverscrollEffect (crate::physics::effect) for the full contract: move the content with the pull, paint a Material-3-Expressive edge stretch about the held edge, or show no visual at all.

use frust_widgets::{OverscrollEffect, ScrollView, scroll_view, text};
let view: ScrollView<()> = scroll_view(text("hi")).overscroll_effect(OverscrollEffect::Stretch);

Plain view-owned data, unlike ScrollView::physics: every build/rebuild carries the current value down to ScrollWidget::effect unconditionally.

Defaults to the effect paired with the platform’s default physics (crate::physics::default_overscroll_effect): the M3E OverscrollEffect::Stretch on Android, translate overscroll (OverscrollEffect::Translate) everywhere else.

Source

pub fn controller(self, controller: ScrollController) -> Self

Attach a ScrollController — the handle app code drives this surface with (ScrollController::jump_to) and reads it through (ScrollController::offset/ScrollController::max_offset/ ScrollController::on_change) from outside any dispatch.

use frust_widgets::{ScrollController, ScrollView, scroll_view, text};
let controller = ScrollController::new();
let view: ScrollView<()> = scroll_view(text("hi")).controller(controller.clone());
§Build/rebuild semantics

A build binds the handle, taking it over from any other surface that held it. A rebuild with the same handle keeps the binding — and, when another surface has since taken the handle over, leaves it there rather than taking it back, so two live views naming one handle never trade it every frame (it re-binds only once the handle is unattached again). A rebuild with a different handle binds that one; a rebuild with none detaches. Dropping the widget detaches the handle it still holds.

Trait Implementations§

Source§

impl<State: 'static> View<State> for ScrollView<State>

Source§

type Element = ScrollWidget

The retained widget this view produces.
Source§

fn build(&self, ctx: &mut BuildCtx<'_>) -> ScrollWidget

Materialise a fresh widget for this view.
Source§

fn rebuild( &self, prev: &Self, element: &mut ScrollWidget, ctx: &mut BuildCtx<'_>, ) -> ChangeFlags

Reconcile prev (the previous view of the same type) against the live element, mutating it in place and reporting what changed.
Source§

fn teardown(&self, element: &mut ScrollWidget, ctx: &mut BuildCtx<'_>)

Tear down element when this view is being removed. Read more
Source§

fn message(&self, _element: &mut Self::Element, _state: &mut State)

Deliver an event message to this view, mutating application state. Read more

Auto Trait Implementations§

§

impl<State> !RefUnwindSafe for ScrollView<State>

§

impl<State> !Send for ScrollView<State>

§

impl<State> !Sync for ScrollView<State>

§

impl<State> !UnwindSafe for ScrollView<State>

§

impl<State> Freeze for ScrollView<State>

§

impl<State> Unpin for ScrollView<State>

§

impl<State> UnsafeUnpin for ScrollView<State>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> StorageAccess<T> for T

Source§

fn as_borrowed(&self) -> &T

Borrows the value.
Source§

fn into_taken(self) -> T

Takes the value.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<State, V> ViewSeq<State, One> for V
where State: 'static, V: View<State>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Push every element of this sequence, in order, onto out — erasing each with AnyView::new (a no-op for an element already an AnyView).