WinUI Rust 学习笔记-02 计数器
2026-08-17
2026-08-17
文章摘要
|
之前的 hello 示例 是静态的,现在看一个动态的示例——计数器,它演示了 Reactor 的核心机制 —— 状态:
#![windows_subsystem = "windows"]
use windows_reactor::*;
fn app(cx: &mut RenderCx) -> Element {
// (A) 声明一个状态:初始值 0,返回 (当前值, 设置器)
let (count, set_count) = cx.use_state(0_i32);
// (B) 从设置器派生出三个「点击处理闭包」
let inc = set_count.setter(count + 1); // setter 方法生成一个可复用的闭包
let dec = set_count.setter(count - 1);
let reset = set_count.setter(0);
vstack((
text_block(format!("Count: {count}")) // 界面直接显示当前状态
.bold()
.font_size(28.0),
hstack((
button("-").on_click(dec), // (C) 按钮点击事件绑定闭包
button("+").on_click(inc),
button("Reset").on_click(reset),
))
.spacing(8.0),
))
.spacing(12.0)
.into()
}
fn main() -> Result<()>{
bootstrap()?;
App::new()
.title("计数器")
.render(app)
}(A) use_state —— 状态钩子
let (count, set_count) = cx.use_state(0_i32);use_state(初始值) 返回一个元组:
- count:当前值(i32,初值 0)。render 每次执行时读到的是最新值。
- set_count:SetState<i32> 类型——一个可克隆的「设置器」句柄。
> 这是 React 风格的 hooks API。你不能直接修改 count;
> 只能通过 set_count 更新。更新后会触发一次新的 render。
(B) setter 方法
let inc = set_count.setter(count + 1);SetState::setter(新值) 返回一个 impl Fn() 闭包,调用它 = 把状态设为那个值 + 触发重渲染。
这里生成了三个闭包,分别把计数 +1、-1、归零。
(C) 绑定事件
button("-").on_click(dec).on_click(闭包) 把按钮的点击事件绑定到闭包上。用户点击时闭包被调用,
状态更新,Reactor 自动重渲染,text_block 里的数字随之变化。
运行
cargo run
你会看到:
一个窗口,标题为 "Counter";
中间是大号数字
Count: 0;三个按钮
-、+、Reset;点
+,数字变为1,没有任何手动刷新代码——这就是 Reactor 替你做的事。
01-02小结:你已经跑通了第一个应用,理解了三个核心概念——render 函数、use_state、builder 链。