Learn Rust Coding · Aula

Fundamentos de UI em modo imediato

Entenda como egui renderiza.

Aula 1 de 413 etapas

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 animating

Sem 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.

Grátis para começar

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

  1. Fundamentos de UI em modo imediato
  2. Widgets e layout
  3. Gerenciando o estado do aplicativo
  4. Empacotando um aplicativo de desktop
← Voltar para Learn Rust Coding