iced
GUIs reativas inspiradas em Elm em Rust - mensagens explícitas, atualizações imutáveis e widgets nativos.
Receita
use iced::widget::{button, column, text};
use iced::Element;
pub fn update(count: &mut i32, message: Message) {
match message {
Message::Increment => *count += 1,
}
}
pub fn view(count: &i32) -> Element<Message> {
column![
text(format!("{count}")),
button("+").on_press(Message::Increment),
]
.into()
}Quando usar isto:
- Aplicativos desktop para consumidores sem HTML
- Equipes que gostam do fluxo de dados unidirecional do Redux/Elm
- Aplicativos multiplataforma que precisam de estilização personalizada consistente
- Arquitetura amigável para tutoriais para desenvolvedores Rust juniores
Exemplo de Trabalho
use iced::widget::{button, column, text, Column};
use iced::{application, Element};
#[derive(Debug, Clone)]
enum Message {
Increment,
Decrement,
}
struct Counter {
value: i32,
}
impl Counter {
fn new() -> Self {
Self { value: 0 }
}
fn update(&mut self, message: Message) {
match message {
Message::Increment => self.value += 1,
Message::Decrement => self.value -= 1,
}
}
fn view(&self) -> Element<Message> {
column![
text(format!("{}", self.value)),
button("+").on_press(Message::Increment),
button("-").on_press(Message::Decrement),
]
.into()
}
}
fn main() -> iced::Result {
application("Counter", Counter::update, Counter::view)
.run_with(Counter::new)
}O que isto demonstra:
- O helper
applicationconectando update/view - Mensagens separadas de incremento/decremento
- Layout de coluna compondo widgets
Mergulho Profundo
Como Funciona
- O runtime recebe eventos do sistema operacional, converte para
Message. updatemodifica o modelo;viewreconstrói a árvore deElement.- O renderizador de diff minimiza o trabalho da GPU (backend wgpu).
Subscriptiontransmite eventos externos (tempo, teclado).
Peças da Arquitetura
| Peça | Papel |
|---|---|
| Model | Struct de estado do aplicativo |
| Message | Enum de evento |
| update | Transição de estado |
| view | Função de UI |
Armadilhas
- Funções
viewgrandes - difíceis de manter. Correção: dividir em submódulos que retornamElement. - Esquecer
subscription- timers nunca disparam. Correção: conectarapplication::subscriptionao usar fontes assíncronas. - Clonagem em cada mensagem - modelos pesados prejudicam o desempenho. Correção: usar
Arcpara partes somente leitura no modelo. - Renderização de fontes da plataforma - verificar CJK em todos os alvos. Correção: carregamento de fontes personalizadas nas configurações.
- Mudanças na API do iced 0.13 - fixar a versão do livro/tutorial à versão da crate.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| egui | Ferramentas de modo imediato | Preferir testes MVU rigorosos |
| Tauri | Equipe de UI web | Não desejar HTML |
| Slint | DSL orientada a designer | Preferir código de widget somente Rust |
| Qt via CXX | Controles nativos maduros | Objetivo de dependência puramente Rust |
FAQs
Como testar a lógica de update?
Funções update puras são testadas unitariamente sem executar a janela - passe mensagens, afirme o modelo.
HTTP Assíncrono no iced?
Use padrões Command/Task (dependente da versão) para realizar HTTP e mapear o resultado para Message.
Estilização personalizada?
Personalização de Theme e métodos style em widgets para cores da marca.
Múltiplas janelas?
Suportado em APIs avançadas - comece com uma única janela até precisar.
wgpu vs tiny-skia?
wgpu para aceleração de GPU; renderizador de software para CI e screenshots headless.
Pilhas de navegação?
Modele rotas como um enum; view corresponde a rota para funções de página.
Validação de formulários?
Armazene erros de campo no modelo; exiba perto dos widgets em view.
Empacotamento?
Empacotamento e Distribuição para binários de lançamento.
Estado em escala?
Estado e Arquitetura para MVU + camadas.
vs egui?
iced retido/diff; egui imediato - veja egui.
Relacionados
- Noções Básicas de GUI - introdução ao contador iced
- Estado e Arquitetura - escalando MVU
- egui - alternativa de modo imediato
- Empacotamento e Distribuição - lançamentos
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.