Gérer l’état de l’application
Conservez et mettez à jour les données de l’interface.
Gérer l’état de l’application est une leçon Learn Rust Coding gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Learn Rust Coding, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Learn Rust Coding comprend 4 leçons au total.
L’état dans la structure App
Dans egui, l’état de votre application est constitué de données Rust ordinaires stockées dans la structure qui implémente eframe::App. Il n’existe ni magasin spécial ni modèle géré par le framework.
Les champs contiennent tout : saisies de formulaire, sélections, données chargées et indicateurs. À chaque image, update lit et modifie directement ces champs via &mut self.
struct App {
query: String,
results: Vec<Item>,
selected: Option<usize>,
loading: bool,
}Dériver Default
eframe construit votre application dans une fermeture transmise à run_native. Le modèle le plus simple consiste à utiliser #[derive(Default)] et à construire l’instance avec App::default().
Pour des valeurs initiales qui ne sont pas celles par défaut, implémentez Default manuellement ou ajoutez un constructeur qui accepte le CreationContext afin d’effectuer la configuration, comme celle des polices ou de la persistance.
impl App {
fn new(cc: &eframe::CreationContext) -> Self {
let mut app = Self::default();
app.dark = cc.egui_ctx.style().visuals.dark_mode;
app
}
}Source unique de vérité
Comme les widgets empruntent &mut aux champs qui les alimentent, la structure constitue toujours la source unique de vérité. Il n’existe aucun état de vue distinct à synchroniser.
Une case à cocher liée à &mut self.enabled reflète et met directement à jour ce booléen : si vous le lisez ailleurs au cours de la même image, vous obtenez sa valeur actuelle.
ui.checkbox(&mut self.enabled, "Enabled");
if self.enabled {
ui.label("Feature is on");
}Différer les modifications
Un problème subtil d’emprunt se pose souvent : vous parcourez un Vec tout en souhaitant en supprimer des éléments. Vous ne pouvez pas modifier le vecteur tant qu’un emprunt partagé est actif.
La solution consiste à enregistrer l’action souhaitée dans une variable locale pendant la boucle, puis à l’appliquer après la fin de celle-ci.
let mut to_remove = None;
for (i, item) in self.items.iter().enumerate() {
ui.horizontal(|ui| {
ui.label(&item.name);
if ui.button("x").clicked() { to_remove = Some(i); }
});
}
if let Some(i) = to_remove { self.items.remove(i); }Écrans pilotés par une énumération
Pour les applications à plusieurs écrans, représentez la vue actuelle par un champ de type énumération. La méthode update l’examine pour décider de ce qu’il faut afficher.
La navigation reste ainsi explicite et exhaustive : le compilateur vous oblige à gérer chaque écran, ce qui élimine toute une catégorie de problèmes de routage.
enum Screen { Home, Settings, About }
match self.screen {
Screen::Home => self.draw_home(ui),
Screen::Settings => self.draw_settings(ui),
Screen::About => self.draw_about(ui),
}La mémoire egui pour l’état de l’interface
Certains états concernent uniquement l’interface, et non votre domaine métier : sections réduites, positions de défilement ou état d’un déplacement. egui les stocke dans ctx.memory, avec une clé correspondant à l’Id du widget.
Vous y accédez rarement directement, mais ctx.data_mut vous permet de stocker de petites valeurs propres à chaque identifiant, conservées entre les images sans encombrer la structure de votre App.
let id = egui::Id::new("my_toggle");
let mut open = ctx.data_mut(|d| d.get_temp::<bool>(id).unwrap_or(false));
ui.checkbox(&mut open, "Open");
ctx.data_mut(|d| d.insert_temp(id, open));Travail en arrière-plan avec des canaux
Ne bloquez jamais update avec des opérations d’E/S lentes : cela fige la boucle à 60 images par seconde. Créez un thread et communiquez par l’intermédiaire d’un canal std::sync::mpsc.
Le thread de travail renvoie les résultats ; à chaque image, update vide le récepteur sans blocage avec try_recv. Appelez ctx.request_repaint() depuis le thread de travail afin que l’interface soit réveillée à l’arrivée des données.
if let Ok(msg) = self.rx.try_recv() {
self.results = msg;
self.loading = false;
}Créer le thread de travail
Clonez le Context et l’émetteur dans le thread. Le clonage est peu coûteux — il repose en interne sur un Arc — et permet au thread de travail de demander un nouveau rendu.
Transférez la propriété des données d’entrée du travail dans la fermeture afin de satisfaire le vérificateur d’emprunts et d’éviter les problèmes de durée de vie.
let tx = self.tx.clone();
let ctx = ctx.clone();
std::thread::spawn(move || {
let data = expensive_load();
let _ = tx.send(data);
ctx.request_repaint();
});Persister l’état
eframe peut sérialiser votre application entre deux exécutions. Activez la fonctionnalité persistence, dérivez serde::Serialize / Deserialize et implémentez App::save.
Au démarrage, lisez l’état enregistré depuis cc.storage dans votre constructeur, en revenant aux valeurs par défaut si rien n’est stocké.
fn save(&mut self, storage: &mut dyn eframe::Storage) {
eframe::set_value(storage, eframe::APP_KEY, self);
}
// in new():
if let Some(s) = cc.storage {
if let Some(app) = eframe::get_value(s, eframe::APP_KEY) { return app; }
}Garder update rapide
Comme update s’exécute à chaque image, évitez d’y recalculer des données dérivées coûteuses. Mettez les résultats en cache dans des champs et ne les recalculez que lorsque les entrées changent.
Un schéma courant consiste à suivre un indicateur dirty défini par Response::changed(), puis à reconstruire les caches au début de update uniquement lorsque l’indicateur est actif.
if self.dirty {
self.filtered = self.filter_items();
self.dirty = false;
}
for item in &self.filtered { ui.label(&item.name); }La propriété garantit la cohérence
Le thème récurrent est le suivant : egui s’appuie sur la propriété de Rust plutôt que sur un framework pour gérer l’état. Votre structure possède les données, &mut self accorde un accès exclusif à chaque image et les threads communiquent par des canaux.
Il n’existe ni abonnements cachés ni graphes de rappels ; il reste donc facile de comprendre quand et comment l’état change, de manière locale et explicite.
Vérification rapide
Comment devez-vous exécuter une récupération lente sur le réseau ?
Récapitulatif
L’état de l’App est constitué de champs ordinaires dans la structure eframe::App, modifiés via &mut self à chaque image, ce qui fait de la structure la source unique de vérité.
Différez les modifications pendant les parcours, représentez les écrans avec des énumérations, déportez les tâches lentes dans des threads utilisant des canaux et persistez l’état avec le stockage d’eframe. Gardez update rapide en mettant les données dérivées en cache derrière des indicateurs dirty. Ensuite : empaqueter votre application pour la distribuer.
Questions Fréquemment Posées
La leçon « Gérer l’état de l’application » est-elle gratuite ?
Oui — le texte complet de « Gérer l’état de l’application » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Learn Rust Coding, passe à CoddyKit PRO. Le cours Learn Rust Coding comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Gérer l’état de l’application » ?
Conservez et mettez à jour les données de l’interface. Tu pratiques Learn Rust Coding avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Learn Rust Coding ?
Aucune expérience préalable n'est requise. Learn Rust Coding sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Gérer l’état de l’application » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Learn Rust Coding ?
Oui. Chaque leçon Learn Rust Coding inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Bases de l’interface en mode immédiat
- Composants et disposition
- Gérer l’état de l’application
- Empaqueter une application de bureau