iced-rs/iced
GitHub: iced-rs/iced
一个受 Elm 启发的跨平台 Rust GUI 库,通过类型安全的响应式架构帮助开发者简洁高效地构建桌面和 Web 应用界面。
Stars: 30015 | Forks: 1539
## 功能特性
* 简单、易用、开箱即用的 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, 信息收集, 可视化界面, 响应式编程, 图形用户界面, 开源库, 异步编程, 搜索引擎爬虫, 桌面应用, 桌面应用开发, 渲染器, 漏洞扫描, 类型安全, 网络流量审计, 通知系统