0Pricing
Learn Rust Coding · Ders

Uygulama Durumunu Yönetme

Kullanıcı arayüzü verilerini tutup güncelleyin.

Uygulama Durumunu Yönetme, CoddyKit'te ücretsiz bir Learn Rust Coding dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Learn Rust Coding öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Learn Rust Coding kursu toplamda 4 dersten oluşur.

App Yapısındaki Durum

egui'de uygulama durumunuz, eframe::App uygulayan yapı üzerinde bulunan yalın Rust verileridir. Özel bir depo veya çerçeveye ait bir model yoktur.

Her şeyi alanlar tutar: form girdileri, seçimler, yüklenen veriler ve işaretler. Her karede update, bu alanları doğrudan &mut self üzerinden okur ve değiştirir.

struct App {
    query: String,
    results: Vec<Item>,
    selected: Option<usize>,
    loading: bool,
}

Default Türetme

eframe, uygulamanızı run_native'e aktarılan bir kapatma işlevi içinde oluşturur. En basit kalıp #[derive(Default)] kullanmak ve App::default() ile oluşturmaktır.

Varsayılan olmayan başlangıç değerleri için Default özelliğini elle uygulayın veya yazı tipleri ya da kalıcılık gibi ayarlarda kullanılmak üzere CreationContext alan bir oluşturucu ekleyin.

impl App {
    fn new(cc: &eframe::CreationContext) -> Self {
        let mut app = Self::default();
        app.dark = cc.egui_ctx.style().visuals.dark_mode;
        app
    }
}

Tek Doğruluk Kaynağı

Bileşenler destekleyen alanlarına &mut ile ödünç verildiğinden yapı her zaman tek doğruluk kaynağıdır. Eşzamanlı tutulması gereken ayrı bir görünüm durumu yoktur.

&mut self.enabled'a bağlanan bir onay kutusu, bu bool değerini doğrudan yansıtır ve günceller. Aynı karede başka bir yerde okursanız güncel değeri görürsünüz.

ui.checkbox(&mut self.enabled, "Enabled");
if self.enabled {
    ui.label("Feature is on");
}

Değişiklikleri Erteleme

İnce bir ödünç alma sorunu vardır: çoğu zaman bir Vec üzerinde dolaşırken ondan öğe kaldırmak istersiniz. Paylaşılan bir ödünç alma etkin durumdayken vektörü değiştiremezsiniz.

Çözüm, döngü sırasında planlanan işlemi yerel bir değişkende kaydetmek ve döngü sona erdikten sonra uygulamaktır.

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); }

Enum Odaklı Ekranlar

Birden fazla ekranı olan uygulamalarda mevcut görünümü bir enum alanı olarak modelleyin. update yöntemi ne çizileceğine karar vermek için bu alan üzerinde eşleştirme yapar.

Bu, gezinmeyi açık ve eksiksiz tutar; derleyici her ekranı ele almanızı zorunlu kılarak tüm hata sınıflarını ortadan kaldırır.

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),
}

Kullanıcı Arayüzü Durumu için egui Belleği

Bazı durumlar alanınızla değil, yalnızca kullanıcı arayüzüyle ilgilidir: daraltılmış bölümler, kaydırma konumları ve sürükleme durumu. egui bunları bileşen Id'siyle anahtarlanmış şekilde ctx.memory içinde saklar.

Belleğe nadiren doğrudan erişirsiniz; ancak ctx.data_mut, uygulama yapınızı gereksiz yere doldurmadan kareler arasında kalıcı olan küçük kimlik başına değerleri saklamanızı sağlar.

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));

Kanallarla Arka Plan Çalışması

update işlevini yavaş G/Ç işlemleriyle asla engellemeyin; bu, saniyede 60 karelik döngüyü dondurur. Bir iş parçacığı başlatın ve std::sync::mpsc kanalı üzerinden iletişim kurun.

İşçi sonuçları geri gönderir; update ise her karede alıcıyı try_recv ile engellemeden boşaltır. Veriler geldiğinde kullanıcı arayüzünün uyanması için işçiden ctx.request_repaint() çağrısını yapın.

if let Ok(msg) = self.rx.try_recv() {
    self.results = msg;
    self.loading = false;
}

İşçiyi Başlatma

Context ile göndericiyi kopyalayarak iş parçacığına aktarın. Kopyalama ucuzdur; çünkü içeride bir Arc kullanılır ve işçinin yeniden çizim istemesini sağlar.

Ödünç denetleyicisini karşılamak ve ömür sorunlarından kaçınmak için iş girdilerinin sahipliğini kapatma işlevine taşıyın.

let tx = self.tx.clone();
let ctx = ctx.clone();
std::thread::spawn(move || {
    let data = expensive_load();
    let _ = tx.send(data);
    ctx.request_repaint();
});

Durumu Kalıcı Hâle Getirme

eframe, uygulamanızı çalıştırmalar arasında serileştirebilir. persistence özelliğini etkinleştirin, serde::Serialize / Deserialize türetin ve App::save uygulamasını yazın.

Başlangıçta kayıtlı durumu oluşturucunuzdaki cc.storage üzerinden okuyun; kayıtlı bir şey yoksa varsayılan değerlere dönün.

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; }
}

update'ı Ucuz Tutma

update her karede çalıştığı için pahalı türetilmiş verileri burada yeniden hesaplamaktan kaçının. Sonuçları alanlarda önbelleğe alın ve yalnızca girdiler değiştiğinde yeniden hesaplayın.

Yaygın bir yaklaşım şudur: Response::changed() tarafından ayarlanan bir dirty bayrağını izleyin ve önbellekleri yalnızca kirli olduklarında update işlevinin başında yeniden oluşturun.

if self.dirty {
    self.filtered = self.filter_items();
    self.dirty = false;
}
for item in &self.filtered { ui.label(&item.name); }

Sahiplik Kuralları Netleştirir

Tekrarlanan ana fikir şudur: egui, durum yönetimi için çerçeveler yerine Rust sahiplik modeline dayanır. Verilerin sahibi yapınızdır, &mut self her karede özel erişim sağlar ve iş parçacıkları kanallar aracılığıyla iletişim kurar.

Gizli abonelikler veya geri çağırma grafikleri olmadığından, durumun ne zaman ve nasıl değiştiğini anlamak yerel ve açık kalır.

Kısa Kontrol

Yavaş bir ağ isteğini nasıl çalıştırmalısınız?

Özet

Uygulama durumu eframe::App yapısındaki sıradan alanlardan oluşur ve her karede &mut self üzerinden değiştirilir; böylece yapı, gerçeğin tek kaynağı olur.

İterasyon sırasında yapılacak değişiklikleri erteleyin, ekranları enum'larla modelleyin, yavaş işleri kanallarla iş parçacıklarına aktarın ve eframe depolamasıyla kalıcı hâle getirin. Türetilmiş verileri kirli bayraklarının arkasında önbelleğe alarak update işlevini düşük maliyetli tutun. Sıradaki konu: uygulamanızı dağıtım için paketlemek.

Sıkça Sorulan Sorular

“Uygulama Durumunu Yönetme” dersi ücretsiz mi?

Evet — “Uygulama Durumunu Yönetme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Learn Rust Coding kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Learn Rust Coding kursu toplamda 4 dersten oluşur.

“Uygulama Durumunu Yönetme” dersinde ne öğreneceğim?

Kullanıcı arayüzü verilerini tutup güncelleyin. Learn Rust Coding ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Learn Rust Coding öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Learn Rust Coding, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Uygulama Durumunu Yönetme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Learn Rust Coding dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Learn Rust Coding dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Anında Mod Kullanıcı Arayüzü Temelleri
  2. Bileşenler ve Yerleşim
  3. Uygulama Durumunu Yönetme
  4. Masaüstü Uygulaması Paketleme
← Learn Rust Coding Sayfasına Dön