第一个窗口

创建一个自定义元素

打开main.rs,修改为下面内容

#![allow(unused)]
fn main() {
use irisia::Element;

struct MyApp;
impl Element for MyApp {
    // ...
}
}

现在,我们将要为MyApp实现Element trait。
首先,我们使用irisia::render_fn宏来为我们自动实现render函数。

#![allow(unused)]
fn main() {
use irisia::{Element, render_fn};

#[derive(Default)]
struct MyApp;

impl Element for MyApp {
    render_fn! {
        @init(self);
    }
}
}

render_fn宏的语法和build语法几乎完全相似,唯一区别就是@init函数。可以在这里找到build的详细用法。由于rust十分注重宏的卫生性,所以用户必须手动提供self关键字使self可访问。当然,您也可以使用任意有效标识符,例如@init(foo),它们会编译为fn render(foo: &mut Self, ..) ..。 然后,我们添加一个文本框。

#![allow(unused)]
fn main() {
use irisia::{
    textbox::TextBox,
    Element,
    render_fn,
    element::{NeverInitalized, NoProps},
};

#[derive(Default)]
struct MyApp;

impl Element for MyApp {
    render_fn! {
        @init(self);
        TextBox {
            text: "hello world"
        }
    }

    fn create(_: irisia::element::RuntimeInit<Self>) -> Self {
        Self{}
    }

    type Props<'a> = NoProps;
    type ChildProps<'a> = NeverInitalized;
}
}

这样,我们的第一个元素就设计完成了。

添加main函数

我们现在需要创建一个窗口让它运行起来。我们添加一个程序入口, 让它启动一个窗口来将我们的元素作为根元素渲染。

use irisia::{
    textbox::TextBox,
    Element,
    Window,
    render_fn,
};

#[derive(Default)]
struct MyApp;

impl Element for MyApp {
    render_fn! {
        @init(self);
        TextBox {
            text: "hello world"
        }
    }
}

#[irisia::main]
async fn main() {
    Window::new::<MyApp>("my first app").await.unwrap().join().await;
}

点击运行即可看到一个标题为my first app的窗口中渲染的hello world字样了。

您可能会疑惑,MyApp是一个零长度的结构体,那么有缓存吗?是的,这也是有缓存的。render_fn!会帮我们接收一个&mut CacheBox参数,我们定义的TextBox,以及后续您添加的其他元素都会一并缓存在这个缓存盒里,由一个名为AddChildCache的结构体代理。为了让用户专注于应用设计,我们没有让用户接管这部分。但是请注意,如果您选择手动实现render方法,请不要用CacheBox缓存不同类型的元素,这样会导致debug模式下程序panic,release模式下大量性能开销和元素创建。

总而言之,如果您使用render_fn宏,请放心,irisia能够保证妥善保管元素的缓存。