跳转到主要内容
Aether 的 ui 工厂提供一组声明式节点类型,会在 surface、component 与 page 中渲染为原生 Android Compose 视图。每次工厂调用返回普通的节点描述对象;Aether 的 Android 渲染器在展示时将这些描述解析为 Compose 组件。

导入

你也可以直接从传入扩展工厂的 aether 参数上访问 ui

节点类型参考

布局

ui.column(children, opts?)

将子节点纵向堆叠。

ui.row(children, opts?)

将子节点横向排列。默认情况下,行会填满可用宽度,并使所有子节点保持在同一行。 直接子节点可设置 weight,以占用剩余水平空间,同时让兄弟控件保持固有尺寸。

ui.box(children, opts?)

叠加/层叠容器,将子节点彼此叠放绘制。

ui.node("scroll", { children, ...opts })

将子节点包裹在可滚动容器中。

ui.spacer(size?, opts?)

插入固定空白。size 参数同时设置其宽度与高度(dp,默认:8)。

文本

ui.text(content, opts?)

渲染文本字符串。使用 opts.style 应用排版角色:

ui.code(content, opts?)

以等宽文本形式渲染内容。

交互

ui.button(label, actionId, opts?)

可点击按钮,按下时触发已注册的 action。
按钮标签始终单行显示。提供 weight 或显式 width 可控制按钮占用的水平空间。

ui.iconButton(icon, actionId, opts?)

仅图标按钮。在不需要文本标签、需要节省水平空间时使用。

ui.switch(label, checked, actionId, opts?)

带标签的开关。将当前布尔状态作为 checked 传入。
switch 工厂签名为 ui.switch(label, checked, actionId, opts?)。与 button 不同,当前状态是位置参数而非选项,因此 action 处理器始终能收到最新值。

ui.input(value, actionId, opts?)

文本输入框。将当前字符串值作为第一个参数传入。

卡片与导航

ui.card(children, opts?)

卡片容器,用于组织相关内容。

ui.node("pageButton", opts)

导航按钮,点击时打开指定 id 的已注册页面。使用 ui.node("pageButton", { page, label?, icon?, width? }) — 没有独立的 ui.pageButton 工厂函数。

进度与组合

ui.progress(value?, opts?)

渲染圆形进度指示器。省略 value 为不确定(旋转)状态;传入 01 之间的 number 为确定圆形进度。

ui.core()

占位符,标记在 wrap 模式组件注册中应渲染被包裹的原生或替换内容的位置。在 mode: "wrap"registerComponent 调用中使用。

组合节点 — 完整 surface 示例

下面的示例注册一个递增持久计数器的 action,以及一个在聊天输入框上方渲染该计数器的 surface。
所有 ui.* 工厂返回的都是普通 JavaScript 对象 — 即节点描述符。Aether 的 Android 渲染器在显示 surface 或 page 时,将这些对象解析为 Compose 组件。
Row 默认填满可用宽度,其子节点保持固有尺寸。在某个子节点上设置 weight,可让它扩展,同时兄弟控件保持固有尺寸。例如,在按钮上放置 { weight: 1 },会使其在固定宽度标签旁拉伸以填满剩余行空间。