Files
dioxus/examples/04-managing-state/context_api.rs
T
Jonathan Kelley f2b1c6d97f codify "platform" into resolution logic, server-fn/fullstack overhaul (#4596)
overhaul dioxus fullstack using a new implementation of server_fn

This PR is a complete rewrite of dioxus fullstack designed to improve compatibility with axum and to fix a number of compilation errors based on feature flag unification plumbing through macros.
2025-10-03 18:26:19 -07:00

90 lines
2.0 KiB
Rust

//! Demonstrates cross-component state sharing using Dioxus' Context API
//!
//! Features:
//! - Context provider initialization
//! - Nested component consumption
//! - Reactive state updates
//! - Error handling for missing context
//! - Platform-agnostic implementation
use dioxus::prelude::*;
const STYLE: Asset = asset!("/examples/assets/context_api.css");
fn main() {
launch(app);
}
#[component]
fn app() -> Element {
// Provide theme context at root level
use_context_provider(|| Signal::new(Theme::Light));
rsx! {
Stylesheet { href: STYLE }
main {
class: "main-container",
h1 { "Theme Switcher" }
ThemeControls {}
ThemeDisplay {}
}
}
}
#[derive(Clone, Copy, PartialEq, Debug)]
enum Theme {
Light,
Dark,
}
impl Theme {
fn stylesheet(&self) -> &'static str {
match self {
Theme::Light => "light-theme",
Theme::Dark => "dark-theme",
}
}
}
#[component]
fn ThemeControls() -> Element {
let mut theme = use_theme_context();
let current_theme = *theme.read();
rsx! {
div {
class: "controls",
button {
class: "btn",
onclick: move |_| theme.set(Theme::Light),
disabled: current_theme== Theme::Light,
"Switch to Light"
}
button {
class: "btn",
onclick: move |_| theme.set(Theme::Dark),
disabled: current_theme == Theme::Dark,
"Switch to Dark"
}
}
}
}
#[component]
fn ThemeDisplay() -> Element {
let theme = use_theme_context();
rsx! {
div {
class: "display {theme.read().stylesheet()}",
p { "Current theme: {theme:?}" }
p { "Try switching themes using the buttons above!" }
}
}
}
fn use_theme_context() -> Signal<Theme> {
try_use_context::<Signal<Theme>>()
.expect("Theme context not found. Ensure <App> is the root component.")
}