presentation 界面声明
presentation 段声明这个频道的界面形态:左缘活动栏里出现哪些功能区、什么顺序、打开频道默认落在哪个区。功能区既不是软件硬编码,也不是用户侧自由勾选——卡声明、内核照声明渲染。
"presentation": {
"sections": [ // 数组序 = 导航序,是唯一真实顺序
{ "id": "homes" },
{ "id": "content" },
{ "id": "acme.fan-ops", // 第三方区:插件贡献实现,卡声明启用
"provider": "acme.suite" } // 可选:点名由哪个插件提供
],
"defaultSection": "homes", // 打开频道落在哪个区
"contentSurface": "acme.detail" // 可选:内容详情页由哪个插件实现
}
字段规则
sections[].id引用功能区贡献的 id(插件注册),数组顺序就是导航顺序;id 不许重复;sections[].provider可选:同一个区 id 可能有多个插件都想认领,不写就先到先得,写了就只认这一家——别家提供的同名区当作「点名的那个还没装」处理;defaultSection必须是sections里声明过的 id;contentSurface同provider的道理:点名内容详情页的实现方,避免用户装了第二个实现后看到哪个取决于注册顺序。
缺区降级:占位,不隐藏
卡声明了某个区、但提供它的插件没装时:
- 活动栏照常占位——图标灰化 + 就绪度提示,点击进入安装引导页;
defaultSection指向不可达区时,按sections数组序回落到第一个可达区;- 绝不静默隐藏——收卡人要能看见这张卡设计的完整界面形状,知道缺什么。
这与流程的缺步降级是同一条铁律:声明的东西缺件时诚实降级,不崩溃、不装作不存在。
不写 presentation 会怎样
没有 presentation 段的卡(包括从旧版本迁移来的),内核只给最小默认:只有主页。素材、运营这类功能区都来自插件贡献,而且属于「卡点名才出现」的类型——不点名不出现,避免每张卡都被塞进一堆它用不上的区。
备注
卡管结构、机器管状态:用户的临时态(上次停留在哪个区、目录树展开折叠、滚动位置)走本机持久化,不进卡。别把这类东西写进 presentation。