文章
egui的两种初始化界面的方式
目录
这两种写法在本质上都在调用同一个 API:
pub fn run_native(
title: &str,
options: NativeOptions,
app_creator: Box<dyn FnOnce(&CreationContext<'_>) -> Result<Box<dyn App>, RuntimeError>>,
) { … }
区别就在于你传给它的那个闭包里,你是否用到了CreationContext<'_>(这里常简称为 cc 或 _cc)来做初始化。#
1. Box::new(|_cc| Ok(Box::<MyApp>::default()))#
eframe::run_native(
"Confirm exit",
options,
Box::new(|_cc| Ok(Box::<MyApp>::default())),
);
_cc** 没被使用**,所以你的MyApp::default()完全独立于框架上下文。MyApp::default()只能访问它自己在Defaultimpl 里设置的那些字段,不能在启动时注入 egui 的全局上下文、字体、持久化存储、截图缓存区、图像加载器等。- 相当于一个最最简单的「空壳」 App。
2. Box::new(|cc| Ok(Box::new(EditorApp::new(cc))))#
eframe::run_native(
"Editor-rs",
options,
Box::new(|cc| Ok(Box::new(EditorApp::new(cc)))),
);
- 这里
cc: &CreationContext被 **传入到你的 **EditorApp::new(cc)构造函数里。 CreationContext里有 e.g.cc.egui_ctx:可以在构造时注册字体、图片、全局样式;cc.storage:访问之前存储的应用状态(window 大小、折叠面板状态、上次打开的文件路径等);cc.integration_info、cc.frame_info等更多启动时信息;
- 因此你可以在
new(cc)里做「把用户上次的配置恢复到内存」、「加载自定义字体」「给 egui ctx 安装自定义的全局样式」等初始化工作。
📝 小结#
- **不用 **
cc→ 最简单、最轻量,但无法利用 eframe/egui 的持久化、样式或资源注册能力。 - **用 **
cc→ 允许你在 App 启动时接入框架上下文,做更丰富的初始化(状态恢复、资源注入、字体注册……)。 选择哪一种,就看你的应用是否需要在启动阶段「和 egui 框架打交道」。如果只是一个极简 demo,第一种就够了;如果要做编辑器、主题、持久化设置,就第二种更灵活。