用途
本技能面向使用 Makepad 框架(Rust)开发 Robius 应用(如 Robrix、Moly)的场景,聚焦于事件处理与动作(action)模式,帮助开发者在控件与 App 之间建立清晰、可维护的通信机制。
主要能力
技能总结了若干核心模式:
-
自定义动作模式:通过定义领域特定的动作枚举(如 MessageAction)并附带数据(如 MessageDetails),为控件动作提供类型化定义。所有动作枚举需派生出
DefaultNone,并包含None默认变体。 -
从控件发射动作:在控件的
handle_event中通过cx.widget_action(self.widget_uid(), &scope.path, Action::Variant)发射动作,例如点击、长按等交互触发的动作。 -
App 中集中处理动作:实现
MatchEventtrait,在handle_actions中集中处理。文中给出了四种模式:非控件动作使用downcast_ref;控件动作使用as_widget_action().cast();对枚举变体进行downcast_ref匹配;模态框动作处理。处理完成后使用continue。 -
动作类型区分:控件动作(UI 线程、同帧处理)、Posted 动作(来自异步任务,在下一事件周期接收,需配合
SignalToUI::set_ui_signal()唤醒 UI 线程)、全局动作(使用cx.action()进行应用级状态变更)。 -
事件处理模式:包括命中测试(
Hit::FingerDown/FingerUp/FingerMove/FingerHoverIn/FingerHoverOut/FingerScroll)、键盘事件(Event::KeyDown与KeyCode区分)、信号事件(Event::Signal轮询待处理更新队列)。 -
动作链式模式:子控件发射动作,父控件捕获并补充上下文后再转发给 App。
使用方式
在 Makepad 项目中定义动作枚举并使用 #[derive(Clone, DefaultNone, Debug)];控件事件中调用 cx.widget_action;App 中实现 MatchEvent 的 handle_startup 与 handle_actions,并在 AppMain::handle_event 中调用 self.match_event(cx, event) 与 self.ui.handle_event(cx, event, scope)。异步场景使用 Cx::post_action 与 SignalToUI::set_ui_signal()。
适用场景
适用于 Makepad 应用中的自定义动作实现、控件事件处理、App 层集中式动作处理、控件间通信,参考代码库为 Robrix(Matrix 聊天客户端)与 Moly(AI 聊天应用)。
最佳实践(据技能内容)
所有动作枚举使用 DefaultNone 派生并含 None 变体;处理动作后使用 continue;异步动作使用 downcast_ref,UI 动作使用 as_widget_action().cast();异步 post 后始终调用 SignalToUI::set_ui_signal();将动作处理集中在 App::handle_actions;动作命名具描述性。
限制
技能提供的参考文件(references/action-patterns.md、references/event-handling.md、references/moly-action-patterns.md)内容未在此资料中展开,部分细节(如 Timer 重试、单选导航、平台条件动作、UiRunner 事件处理)仅有标题列出,具体实现暂未提供。