Fundamentos de UI em modo imediato
Entenda como egui renderiza.
Fundamentos de UI em modo imediato é uma aula grátis de Learn Rust Coding no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Learn Rust Coding, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Learn Rust Coding inclui 4 aulas no total.
O Que Significa o Modo Imediato
egui é uma biblioteca GUI de modo imediato. Diferentemente dos kits de ferramentas de modo retido (GTK, Qt), nos quais você constrói uma árvore persistente de componentes, egui reconstrói toda a interface do zero a cada quadro.
Seu código é executado de cima para baixo em cada quadro, emitindo componentes como chamadas de função. Não há um grafo de nós armazenado — a interface é apenas um efeito colateral da execução do seu fechamento.
O Loop de Atualização
Um app egui implementa eframe::App, cujo método update é chamado uma vez por quadro, normalmente 60 vezes por segundo.
Dentro de update, você descreve a aparência que a interface deve ter agora, considerando o estado atual. egui não calcula diferenças — simplesmente emite tudo novamente.
impl eframe::App for MyApp {
fn update(&mut self, ctx: &egui::Context, _f: &mut eframe::Frame) {
egui::CentralPanel::default().show(ctx, |ui| {
ui.label("Hello, egui!");
});
}
}Contexto e Ui
Dois tipos essenciais aparecem em toda parte. egui::Context é o identificador compartilhado, barato de clonar, para todo o estado da interface no quadro.
Ui é uma região na qual você adiciona componentes. Painéis e janelas fornecem um &mut Ui dentro do fechamento; você chama métodos como ui.label ou ui.button nele.
egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("Dashboard");
ui.separator();
ui.label("Widgets go here.");
});Os Componentes Retornam Respostas
Como a interface é reconstruída a cada quadro, você não pode registrar retornos de chamada como nos kits de ferramentas de modo retido. Em vez disso, cada chamada de componente retorna imediatamente uma Response.
Você inspeciona a Response no mesmo quadro: .clicked(), .hovered(), .changed(). Isso mantém o tratamento de eventos junto do layout.
if ui.button("Save").clicked() {
self.save();
}
let resp = ui.text_edit_singleline(&mut self.name);
if resp.changed() {
self.dirty = true;
}O Estado Vive em Você
egui armazena pouquíssimos dados da aplicação. Os valores dos seus componentes vivem em self na estrutura App, e você passa referências mutáveis para os componentes.
Um campo de texto recebe &mut String; uma caixa de seleção recebe &mut bool. egui grava os valores de volta por meio da referência, portanto sua estrutura é a única fonte da verdade.
struct MyApp {
name: String,
enabled: bool,
}
// inside update:
ui.text_edit_singleline(&mut self.name);
ui.checkbox(&mut self.enabled, "Enabled");Configurando o eframe
eframe é o framework oficial que hospeda egui em computadores e na web. Ele gerencia a janela nativa, a superfície da GPU e o loop de eventos.
Você o inicia com eframe::run_native, passando um título de janela, opções nativas e um fechamento que cria seu App.
fn main() -> eframe::Result<()> {
let opts = eframe::NativeOptions::default();
eframe::run_native(
"My App",
opts,
Box::new(|_cc| Ok(Box::new(MyApp::default()))),
)
}Re renderização Acionada por Entrada
Por padrão, egui só redesenha quando algo acontece: movimento do mouse, pressionamento de tecla ou uma solicitação explícita. Isso economiza CPU em aplicações ociosas.
Para animações ou dados em tempo real, chame ctx.request_repaint() para agendar outro quadro ou request_repaint_after com uma duração para atualizações programadas.
ui.label(format!("Tick: {}", self.counter));
self.counter += 1;
ctx.request_repaint(); // keep animatingSem IDs de Componentes Retidos (Quase)
egui deriva a identidade do componente a partir da ordem e da posição das chamadas, gerando um Id automaticamente. Isso é importante para elementos como cabeçalhos recolhíveis, que precisam manter uma memória estável entre os quadros.
Quando dois componentes colidiriam — por exemplo, botões com o mesmo rótulo em um loop — envolva-os com ui.push_id(i, |ui| ...) para diferenciá-los.
for (i, item) in self.items.iter().enumerate() {
ui.push_id(i, |ui| {
if ui.button(&item.label).clicked() {
println!("clicked {}", i);
}
});
}Compromissos do Modo Imediato
O modo imediato torna o código da interface naturalmente orientado a dados: um if mostra ou oculta uma seção, e um for renderiza uma lista. Não há adição ou remoção manual de nós nem dessincronização entre o modelo e a visualização.
O custo é que toda a interface é executada novamente a cada quadro; portanto, mantenha baixo o trabalho por quadro e evite cálculos pesados dentro de update.
if self.logged_in {
ui.label(format!("Welcome, {}", self.user));
} else {
ui.label("Please sign in.");
}Aplicação Completa Mínima
Reunindo tudo: uma estrutura mantém o estado, update o desenha e main executa a janela. Esse é o esqueleto completo de qualquer programa egui para computador.
Todo o restante — layout, temas e empacotamento — é construído sobre esse loop.
#[derive(Default)]
struct App { count: i32 }
impl eframe::App for App {
fn update(&mut self, ctx: &egui::Context, _: &mut eframe::Frame) {
egui::CentralPanel::default().show(ctx, |ui| {
if ui.button("+1").clicked() { self.count += 1; }
ui.label(format!("Count: {}", self.count));
});
}
}Por Que Rust Gosta de egui
O design de egui aproveita os pontos fortes de Rust. Emprestar &mut self em uma única chamada a update permite que o verificador de empréstimos garanta a ausência de condições de corrida entre os componentes e seu modelo.
Não há retornos de chamada que capturem estado mutável compartilhado nem grafos de Rc<RefCell> impostos por uma árvore retida — apenas propriedade direta e uma passagem mutável por quadro.
Verificação Rápida
Teste sua compreensão do modo imediato.
Recapitulação
egui usa o modo imediato: toda a interface é reconstruída a cada quadro dentro de eframe::App::update. Os componentes são chamadas de função que retornam uma Response para você inspecionar imediatamente.
Seus dados vivem em self e são passados por referência mutável, portanto o verificador de empréstimos mantém o modelo e a visualização sincronizados. eframe::run_native hospeda a janela e o loop de eventos. A seguir, exploraremos a coleção de componentes e o sistema de layout.
Aprenda Rust com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 39
- Aulas
- 144
Perguntas Frequentes
A aula “Fundamentos de UI em modo imediato” é grátis?
Sim — o texto completo de “Fundamentos de UI em modo imediato” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Learn Rust Coding, atualize para CoddyKit PRO. O curso de Learn Rust Coding inclui 4 aulas no total.
O que vou aprender em “Fundamentos de UI em modo imediato”?
Entenda como egui renderiza. Você pratica Learn Rust Coding com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Learn Rust Coding?
Nenhuma experiência prévia é necessária. Learn Rust Coding no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Fundamentos de UI em modo imediato”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Learn Rust Coding?
Sim. Cada aula de Learn Rust Coding inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Fundamentos de UI em modo imediato
- Widgets e layout
- Gerenciando o estado do aplicativo
- Empacotando um aplicativo de desktop