iced-rs/iced

GitHub: iced-rs/iced

一个受 Elm 启发的跨平台 Rust GUI 库,通过类型安全的响应式架构帮助开发者简洁高效地构建桌面和 Web 应用界面。

Stars: 30015 | Forks: 1539

# Iced [![文档](https://docs.rs/iced/badge.svg)][documentation] [![Crates.io](https://img.shields.io/crates/v/iced.svg)](https://crates.io/crates/iced) [![许可证](https://img.shields.io/crates/l/iced.svg)](https://github.com/iced-rs/iced/blob/master/LICENSE) [![下载量](https://img.shields.io/crates/d/iced.svg)](https://crates.io/crates/iced) [![测试状态](https://img.shields.io/github/actions/workflow/status/iced-rs/iced/test.yml?branch=master&event=push&label=test)](https://github.com/iced-rs/iced/actions) [![Zulip 聊天](https://img.shields.io/badge/chat-on%20Zulip-5e7ce2?logo=zulip&logoColor=white)](https://iced.zulipchat.com/) [![Discord 服务器](https://img.shields.io/discord/628993209984614400?label=&labelColor=6A7EC2&logo=discord&logoColor=ffffff&color=7389D8)](https://discord.gg/3xZJ65GAhd) 一个跨平台的 Rust GUI 库,专注于简洁性和类型安全。 受 [Elm] 启发。
## 功能特性 * 简单、易用、开箱即用的 API * 类型安全的响应式编程模型 * [跨平台支持] (Windows、macOS、Linux 和 Web) * 响应式布局 * 内置小部件(包括[文本输入框][text inputs]、[滚动区域][scrollables] 等!) * 支持自定义小部件(创建你自己的小部件!) * [带有性能指标和时间旅行的调试工具][Debug tooling with performance metrics and time traveling] * 对异步操作的一流支持(使用 futures!) * 拆分为可复用部分的模块化生态系统: * 一个[与渲染器无关的原生运行时][renderer-agnostic native runtime],支持与现有系统集成 * 两个利用 [`wgpu`] 和 [`tiny-skia`] 的内置渲染器 * [`iced_wgpu`] 支持 Vulkan、Metal 和 DX12 * [`iced_tiny_skia`] 提供软件降级替代方案 * 一个[窗口外壳][windowing shell] __Iced 目前是实验性软件。__ [查看路线图][Take a look at the roadmap] 并 [查看问题列表][check out the issues]。 ## 概述 受 [The Elm Architecture] 启发,Iced 期望你将用户界面 拆分为四个不同的概念: * __状态 (State)__ — 你的应用程序的状态 * __消息 (Messages)__ — 你关心的用户交互或有意义的事件 * __视图逻辑 (View logic)__ — 一种将你的__状态__显示为小部件的方式, 这些小部件可能会在用户交互时产生__消息__ * __更新逻辑 (Update logic)__ — 一种对__消息__作出反应并更新你的 __状态__的方式 我们可以构建一些东西来看看它是如何工作的!假设我们想要一个简单的计数器, 它可以通过两个按钮进行递增和递减。 我们首先对应用程序的__状态__进行建模: ``` #[derive(Default)] struct Counter { value: i32, } ``` 接下来,我们需要定义计数器可能的用户交互: 按钮按下。这些交互就是我们的__消息__: ``` #[derive(Debug, Clone, Copy)] pub enum Message { Increment, Decrement, } ``` 现在,让我们通过在__视图逻辑__中将它们组合在一起, 来展示实际的计数器: ``` use iced::widget::{button, column, text, Column}; impl Counter { pub fn view(&self) -> Column<'_, Message> { // We use a column: a simple vertical layout column![ // The increment button. We tell it to produce an // `Increment` message when pressed button("+").on_press(Message::Increment), // We show the value of the counter here text(self.value).size(50), // The decrement button. We tell it to produce a // `Decrement` message when pressed button("-").on_press(Message::Decrement), ] } } ``` 最后,我们需要能够对任何产生的__消息__作出反应, 并在我们的__更新逻辑__中相应地更改我们的__状态__: ``` impl Counter { // ... pub fn update(&mut self, message: Message) { match message { Message::Increment => { self.value += 1; } Message::Decrement => { self.value -= 1; } } } } ``` 这就是全部内容了!我们刚刚编写了一个完整的用户界面。让我们运行它: ``` fn main() -> iced::Result { iced::run(Counter::update, Counter::view) } ``` Iced 会自动: 1. 获取我们的__视图逻辑__的结果并对其小部件进行布局。 2. 处理来自系统的事件,并为我们的 __更新逻辑__生成__消息__。 3. 绘制最终的用户界面。 阅读[书籍][book]、[文档][documentation]和[示例][examples]以了解更多信息! ## 实现细节 Iced 最初诞生于将 [Elm] 和 [The Elm Architecture] 的简洁性引入 [Coffee](我正在开发的一个 2D 游戏库)的尝试。 该库的核心是在 2019 年 5 月期间在[这个拉取请求][this pull request]中实现的。 [第一个 alpha 版本][The first alpha version]最终作为 [一个与渲染器无关的 GUI 库][a renderer-agnostic GUI library]发布。该库没有提供渲染器,而是 在 [`ggez`](一个游戏库)之上实现了当前的[教程示例][tour example]。 从那时起,重点已转向提供一个开箱即用的、面向最终用户的 GUI 库,同时保持生态系统的模块化。 ## 贡献 / 反馈 如果你想做出贡献,请阅读我们的[贡献指南][contributing guidelines]以获取更多详细信息。 我们也欢迎反馈!你可以在[我们的 Zulip 论坛][our Zulip forum]创建一个新话题, 或者来到[我们的 Discord 服务器][our Discord server]聊天。 ## 赞助商 Iced 的开发由 [Kraken.com] 的 [Cryptowatch] 团队赞助
标签:AI工具, Elm, GUI, MVC架构, Rust, WebAssembly, wgpu, 信息收集, 可视化界面, 响应式编程, 图形用户界面, 开源库, 异步编程, 搜索引擎爬虫, 桌面应用, 桌面应用开发, 渲染器, 漏洞扫描, 类型安全, 网络流量审计, 通知系统