返回文章列表

文章

egui的两种初始化界面的方式

目录
  1. 区别就在于你传给它的那个闭包里,你是否用到了CreationContext<'_>(这里常简称为 cc 或 _cc)来做初始化。
  2. 1. Box::new(|_cc| Ok(Box::<MyApp>::default()))
  3. 2. Box::new(|cc| Ok(Box::new(EditorApp::new(cc))))
  4. 📝 小结

这两种写法在本质上都在调用同一个 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() 只能访问它自己在 Default impl 里设置的那些字段,不能在启动时注入 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_infocc.frame_info 等更多启动时信息;
  • 因此你可以在 new(cc) 里做「把用户上次的配置恢复到内存」、「加载自定义字体」「给 egui ctx 安装自定义的全局样式」等初始化工作。

📝 小结#

  • **不用 **cc → 最简单、最轻量,但无法利用 eframe/egui 的持久化、样式或资源注册能力。
  • **用 **cc → 允许你在 App 启动时接入框架上下文,做更丰富的初始化(状态恢复、资源注入、字体注册……)。 选择哪一种,就看你的应用是否需要在启动阶段「和 egui 框架打交道」。如果只是一个极简 demo,第一种就够了;如果要做编辑器、主题、持久化设置,就第二种更灵活。