Widget trait 表示 UI 的组件。Druid 包含一组内置的小部件,您也可以编写自己的小部件。将内置小部件和自定义小部件组合起来创建一个小部件树; 您将从一些单根小部件开始,这些小部件(通常)有子部件,它们本身可能有子部件,等等。Widget 有一个通用参数 T,表示该小部件处理的数据。有些小部件(比如布局小部件)可能完全不知道它们遇到的数据类型,而其他小部件(比如滑块)可能期望只有一种类型(比如 f64)。
widgets
由所有小部件实现的 trait。
小部件的所有外观和行为都封装在实现此特性的对象中。
Trait 由关联数据的类型(T)参数化。所有 trait 方法都可以访问这些数据,并且在事件的情况下,引用是可变的,因此事件可以直接更新数据。
只要应用程序数据发生变化,框架就会使用 update 方法遍历小部件层次结构。框架需要知道数据实际上是否已经更改,这就是为什么 T 有一个 Data 绑定。
所有的特征方法都提供了相应的上下文。小部件可以通过调用上下文中的方法来请求事物并导致操作。
此外,所有 trait 方法都提供了一个环境(Env)。
容器小部件通常不会直接在它们的子小部件上调用 Widget 方法,而是拥有封装在 WidgetPod 中的小部件,并在其上调用相应的方法。WidgetPod 包含这些遍历的状态和逻辑。另一方面,特别是轻量级容器可能直接包含它们的子 Widget (当不需要布局或事件流逻辑时) ,并且在这些情况下将调用这些方法。
作为一般模式,容器小部件将在其所有子级上调用相应的 WidgetPod 方法。WidgetPod 根据需要应用逻辑来确定是否递归。
\
pub fn event(
&mut self,
ctx: &mut EventCtx<'_, '_>,
event: &Event,
data: &mut T,
env: &Env
)
处理事件
此方法调用处理许多不同的事件(在 Event 枚举中)。小部件可以通过多种方式处理这些事件: 从 EventCtx 请求事件、变更数据或提交命令
\
pub fn lifecycle(
&mut self,
ctx: &mut LifeCycleCtx<'_, '_>,
event: &LifeCycle,
data: &T,
env: &Env
)
处理生命周期通知。
调用此方法是为了通知小部件某些特殊事件(可在 LifeCycle 枚举中获得) ,这些事件通常与小部件图中的变化或特定小部件的状态有关。
小部件不会根据这些事件变更应用程序状态,而只是根据需要更新它自己的内部状态; 如果小部件需要变更数据,它可以提交一个将在下一次机会执行的 Command。
\
pub fn update(
&mut self,
ctx: &mut UpdateCtx<'_, '_>,
old_data: &T,
data: &T,
env: &Env
)
更新小部件的外观以响应应用程序的 Data 或 Env 的更改。
每当数据或环境发生更改时调用此方法。当需要更新小部件的外观以响应这些更改时,您可以在提供的 UpdateCtx 上调用 request _ aint 或 request _ layup,以根据需要安排绘制和布局的调用。
如果小部件希望计算细粒度的增量,则提供数据的前一个值; 如果实际需要,则应尝试仅请求新的布局或绘制通过。
要确定 Env 是否已经更改,可以在提供的 UpdateCtx 上调用 Env _ change; 然后可以使用小部件中使用的任何键调用 Env _ key _ change,查看它们是否已经更改; 然后可以根据需要请求布局或绘制。
\
pub fn layout(
&mut self,
ctx: &mut LayoutCtx<'_, '_>,
bc: &BoxConstraints,
data: &T,
env: &Env
) -> Size
计算布局
叶子小部件应该确定它的大小(受提供的约束的限制)并返回它。
容器小部件将在其子小部件上递归地调用 WidgetPod: : 布局,为每个小部件提供适当的框约束、计算布局,然后在其每个子小部件上调用 set _ source。最后,它应该返回容器的大小。容器可以以任何顺序递归,这对于首先计算非 flex 小部件的大小来确定可用于 flex 小部件的空间量是很有帮助的。
为了提高效率,容器应该只调用一次子窗口小部件的布局,尽管没有任何强制措施。
布局策略受到 Flutter 的强烈启发。
\
pub fn paint(&mut self, ctx: &mut PaintCtx<'_, '_, '_>, data: &T, env: &Env)
绘制小部件外观。
PaintCtx 对实现 RenderContext 特性的内容进行了定义,该特性公开了小部件可以用来绘制其外观的各种方法。
容器小部件可以在递归到它们的子元素之前绘制背景,或者在之后绘制注释(例如,滚动条)。此外,它们还可以对呈现上下文应用掩码和转换,这对滚动特别有用。
我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿。