Skip to content

widget ​

widget 是首页 Dashboard 中的小组件。用户可以添加实例并填写参数。UI 仅支持 runtime 中已注册的模板,JavaScript 扩展不能绘制自定义视图。

字段 ​

字段必填含义
type是"widget"
id / title是包内唯一;添加到桌面时的名称
template是runtime 模板 ID,见下文
families否支持的尺寸:small / medium / large / extraLarge。默认使用模板支持的全部尺寸
params否用户配置这块小组件时的字段
constants否由开发者指定且用户无法修改的输入参数
cache否默认 ttlSeconds: 3600
load是protocol 方法
placeholderData否字面量示例数据。安装时写入清单,不执行 JavaScript
placeholder否示例数据函数。实现后优先于 placeholderData

Protocol ​

ts
load(ctx, input) => Promise<WidgetContent>

input: {
  instanceId?: string;               // 该实例的稳定 ID,由 App 生成,不属于 params
  params: Record<string, unknown>;   // 该实例用户配置 + constants
  family: "small" | "medium" | "large" | "extraLarge";
  page?: PageToken;                  // 仅在“展开全部”时提供
}

placeholder?(ctx, input) => Promise<WidgetContent>

input: {
  family: "small" | "medium" | "large" | "extraLarge";
}

WidgetContent: {
  items: ListItem[];
  next?: PageToken;
}

placeholderData 和 placeholder 均为可选项,仅用于 Widget Picker 的预览渲染,不属于首页时间线。其结构与 load 返回的 WidgetContent 相同。预览数据不对应具体实例,也不包含用户 params;应使用本地示例数据,不应发起网络请求。如果两者均未提供,安装阶段将跳过预览数据采集,Picker 仅显示标题。App 会在安装或包版本发生变化时获取一次预览数据:如果实现了 placeholder,则调用该方法(可根据 ctx.settings 调整标题);否则使用清单中的 placeholderData。结果将写入磁盘,并在卸载时清除。

Dashboard 仅展示模板可容纳的前 N 个条目。N 由模板和 family(即 WidgetSize:small / medium / large / extraLarge)决定。用户选择“展开全部”时,App 会继续调用同一个 load,改用全屏列表模板,并通过 page 实现分页。无需为展开功能实现额外方法。

params 的字段结构与包 settings 相同,见 数据模型 · 用户字段。locale / userId 只在 ctx 里。

模板 ​

模板属于 runtime,不在扩展中定义。扩展仅声明 template ID。对于无法识别的 ID,App 将拒绝添加对应小组件。

当前已注册的模板:

ID适用尺寸交互行为
poster-gridsmall / medium / large每张海报默认打开 detail,可选显示播放按钮
poster-rankedsmall / medium / large前三张海报呈扇形叠放:第 1 名居中、第 2 名在左、第 3 名在右;点击海报进入详情;仅第 1 名显示播放按钮
poster-pagerextraLarge横向分页大海报:中间显示一张完整卡片,两侧显示上一张和下一张的局部内容;底部叠加标题与 releaseDate · genre;点击卡片进入详情
ranked-railextraLarge横向滚动的排行海报:约显示三张完整卡片及右侧下一张的局部内容;左上角显示排名,底部叠加标题与 genre;点击卡片进入详情
backdrop-heromedium / large主卡片 detail;播放按钮
ranked-listmedium / large每行 detail
schedule-daymedium / large每行 detail

条目与点击 ​

load 返回 ListItem[],每个条目必须包含 ref。点击事件不由 widget 处理,详见架构 · 点击解析。

字段作用
intent卡片主体的默认行为。省略时视为 "detail"。"play" 适用于点击卡片后直接播放的模板,但仍需满足播放条件
episode已确定的季、集。仅提供此字段时,才允许从小组件直接播放剧集

widget 不提供 loadDetail 或 sources。如需支持详情或播放,应在同一包中提供对应 type 的扩展。