Files
docs/versioned_docs/version-0.0.9/e_state.md
T
2025-07-30 17:48:38 +02:00

1.5 KiB

title, slug
title slug
State Management /state

OSUI has builtin state management, the State<T> type is easy to use. A State<T> makes dependencies reload if the state is updated.

Example

A counter app that increments every 100 milliseconds

use osui::prelude::*;

fn main() -> std::io::Result<()> {
    let screen = Screen::new();
    let count = use_state(0);

    rsx! {
        %count // Dependency of count
        "Count: {count}"
    }
    .draw(&screen);

    std::thread::spawn(move || loop {
        **count.get() += 1;
        std::thread::sleep(std::time::Duration::from_millis(100));
    });

    screen.run()
}

use_state<T>(v: T) -> State<T>

Returns a State of T with the specified default value.

State<T>

A smart pointer that is wrapped around a Arc<Mutex<T>> and manages the state of the holding value, any changes will result in the dependencies reloading, making a smart and efficient approach instead of reloading the whole thing.

get(&self) -> MutexGuard<'_, Inner<T>>

Gets a lock on the state for read/write access.

set(&self, v: T)

Sets the value and marks it as updated.

update(&self)

Marks the state as updated.

Trait DependencyHandler

The DependencyHandler trait is a state management trait that will reload dependencies if the values are true

fn add(&self)

Called when a dependency is added, for incrementing a dependency counter.

check(&self) -> bool

Should return if the dependencies need to reload, if true the dependencies will reload, called after render.