1
0

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_countSetState<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 链

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

评论