pub struct VirtualScrollView<D, B: Fn(usize, &D) -> Element> { /* private fields */ }Expand description
One-direction scrollable area that dynamically builds and renders items based in their size and current available size, this is intended for apps using large sets of data that need good performance.
Unlike ScrollView, which lays out every child even when it is
off screen, a VirtualScrollView takes a builder closure and only calls it for the items that
are actually visible, so the cost stays roughly constant no matter how long the list is.
It needs two things to know which items fall inside the viewport:
item_size, the fixed size of each item along the scroll axis,
and length, the total number of items.
§Example
fn app() -> impl IntoElement {
rect().child(
VirtualScrollView::new(|i, _| {
rect()
.key(i)
.height(Size::px(25.))
.padding(4.)
.child(format!("Item {i}"))
.into()
})
.length(300usize)
.item_size(25.),
)
}
§Preview
Implementations§
Source§impl<B: Fn(usize, &()) -> Element> VirtualScrollView<(), B>
impl<B: Fn(usize, &()) -> Element> VirtualScrollView<(), B>
Sourcepub fn new(builder: B) -> Self
pub fn new(builder: B) -> Self
Creates a virtual scroll view that builds each item on demand from its index.
Sourcepub fn new_controlled(builder: B, scroll_controller: ScrollController) -> Self
pub fn new_controlled(builder: B, scroll_controller: ScrollController) -> Self
Like new but driven by the given ScrollController.
Source§impl<D, B: Fn(usize, &D) -> Element> VirtualScrollView<D, B>
impl<D, B: Fn(usize, &D) -> Element> VirtualScrollView<D, B>
Sourcepub fn new_with_data(builder_data: D, builder: B) -> Self
pub fn new_with_data(builder_data: D, builder: B) -> Self
Like new but passes shared builder_data to every item build.
The builder closure cannot be compared across renders, so data captured inside it never
triggers a rebuild. Passing the data here instead makes it part of the view’s PartialEq,
so the visible items are rebuilt whenever it changes.
fn app() -> impl IntoElement {
let items = use_state(|| vec!["a".to_string(), "b".to_string(), "c".to_string()]);
// The current items are passed as data, so editing `items` rebuilds the visible rows.
VirtualScrollView::new_with_data(items.read().clone(), |i, items: &Vec<String>| {
rect()
.key(i)
.height(Size::px(25.))
.child(items[i].clone())
.into()
})
.length(items.read().len())
.item_size(25.)
}Sourcepub fn new_with_data_controlled(
builder_data: D,
builder: B,
scroll_controller: ScrollController,
) -> Self
pub fn new_with_data_controlled( builder_data: D, builder: B, scroll_controller: ScrollController, ) -> Self
Like new_with_data but driven by the given ScrollController.
Sourcepub fn show_scrollbar(self, show_scrollbar: bool) -> Self
pub fn show_scrollbar(self, show_scrollbar: bool) -> Self
Toggles whether the scrollbar is shown when the content overflows.
Sourcepub fn direction(self, direction: Direction) -> Self
pub fn direction(self, direction: Direction) -> Self
Sets the axis the items flow and scroll in.
Sourcepub fn scroll_with_arrows(self, scroll_with_arrows: impl Into<bool>) -> Self
pub fn scroll_with_arrows(self, scroll_with_arrows: impl Into<bool>) -> Self
Toggles whether the arrow keys scroll the view while it is focused.
Sourcepub fn item_size(self, item_size: impl Into<f32>) -> Self
pub fn item_size(self, item_size: impl Into<f32>) -> Self
Sets the fixed size of every item along the scroll axis, used to decide which items to render.
Sourcepub fn length(self, length: impl Into<usize>) -> Self
pub fn length(self, length: impl Into<usize>) -> Self
Sets the total number of items the view can scroll through.
Sourcepub fn invert_scroll_wheel(self, invert_scroll_wheel: impl Into<bool>) -> Self
pub fn invert_scroll_wheel(self, invert_scroll_wheel: impl Into<bool>) -> Self
Inverts the direction of the mouse wheel relative to the content.
Sourcepub fn drag_scrolling(self, drag_scrolling: bool) -> Self
pub fn drag_scrolling(self, drag_scrolling: bool) -> Self
Toggles scrolling by dragging the content, useful mainly for touch input.
Sourcepub fn scroll_controller(
self,
scroll_controller: impl Into<Option<ScrollController>>,
) -> Self
pub fn scroll_controller( self, scroll_controller: impl Into<Option<ScrollController>>, ) -> Self
Attaches a ScrollController to drive this view externally.
Sourcepub fn max_height(self, max_height: impl Into<Size>) -> Self
pub fn max_height(self, max_height: impl Into<Size>) -> Self
Caps the height of the scroll view.
Trait Implementations§
Source§impl<D: Clone, B: Clone + Fn(usize, &D) -> Element> Clone for VirtualScrollView<D, B>
impl<D: Clone, B: Clone + Fn(usize, &D) -> Element> Clone for VirtualScrollView<D, B>
Source§fn clone(&self) -> VirtualScrollView<D, B>
fn clone(&self) -> VirtualScrollView<D, B>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<D: PartialEq + 'static, B: Fn(usize, &D) -> Element + 'static> Component for VirtualScrollView<D, B>
impl<D: PartialEq + 'static, B: Fn(usize, &D) -> Element + 'static> Component for VirtualScrollView<D, B>
fn render(self: &VirtualScrollView<D, B>) -> impl IntoElement
fn render_key(&self) -> DiffKey
Source§impl<D: PartialEq, B: Fn(usize, &D) -> Element> LayoutExt for VirtualScrollView<D, B>
impl<D: PartialEq, B: Fn(usize, &D) -> Element> LayoutExt for VirtualScrollView<D, B>
Source§fn get_layout(&mut self) -> &mut LayoutData
fn get_layout(&mut self) -> &mut LayoutData
Auto Trait Implementations§
impl<D, B> Freeze for VirtualScrollView<D, B>
impl<D, B> !RefUnwindSafe for VirtualScrollView<D, B>
impl<D, B> !Send for VirtualScrollView<D, B>
impl<D, B> !Sync for VirtualScrollView<D, B>
impl<D, B> Unpin for VirtualScrollView<D, B>
impl<D, B> UnsafeUnpin for VirtualScrollView<D, B>where
B: UnsafeUnpin,
D: UnsafeUnpin,
impl<D, B> !UnwindSafe for VirtualScrollView<D, B>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> ComponentKey for Twhere
T: Component,
impl<T> ComponentKey for Twhere
T: Component,
fn default_key(&self) -> DiffKey
§impl<T> ComponentProps for T
impl<T> ComponentProps for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more