Callbacks and Lifetime / 回调与生命周期
PixelUI 的大部分回调用 ETL 内联存储:
1 | using InputCallback = etl::inplace_function<bool(InputEvent), CALLBACK_STORAGE_SIZE>; |
推荐的 App 成员捕获
1 | void onEnter(ExitCallback cb) override { |
App 销毁前的统一清理顺序见App 生命周期与 ViewManager。
常见错误
1 | void configure() { |
同样,不要把局部字符数组传给 Widget/Popup 后返回,不要把局部数值引用排入 Popup 队列,也不要让 getCurrentApp() 得到的指针跨过 pop。
Numeric Formatter、编辑 Binding 和 Session 也遵循同一边界:Formatter context、suffix 字符串和百分比 range,Binding 的 value/changed context,以及注入的 ValueEditSession& 都是非拥有的。用于排队 Popup 时,它们必须覆盖 pending 和 active 两个阶段。更短寿命的 owner 销毁前必须调用 clearPopups()。
内联容量
大 lambda 可能在编译时无法放入 etl::inplace_function。与其把容量全局调大,更常见的做法是只捕获 this、指针或小型 ID;具体容量见资源上限。
成员声明顺序
C++ 按成员声明的反向顺序析构。如果 Widget 持有某个 buffer 或状态的非拥有引用,把被引用对象声明在 Widget 之前。Chart 的具体写法见组件与焦点光标。


