SuperNode

View

配置 JSX,并在 App 与 Widget 两种 surface 之间选择。

配置 JSX

两种视图 surface 共用同一个自动 JSX runtime,将 jsxImportSource 设为 supernode:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "jsx": "react-jsx",
    "jsxImportSource": "supernode",
    "strict": true,
    "outDir": "dist"
  },
  "include": ["*.tsx"]
}

在 package.json 中设置 "type": "module"。通过 TypeScript 编译 TSX,再在 SuperNode 中运行生成的 JavaScript,例如 tsc && node dist/main.js。SuperNode 提供 supernode 运行时包;执行该命令需要项目安装 TypeScript 编译器。

选择 surface

SuperNode 有两种视图 surface。App 页面由 Compose 渲染,支持状态、输入和实时走动的时间;桌面小组件由 Glance 转成 RemoteViews 渲染,只开放 Glance 能如实渲染的能力。通过导入路径选择 surface:

Surface导入路径渲染方式参考
App 页面supernode/app(组件、Modifier 与 Hooks)Compose组件、Modifier、Hooks 与 Context
Widget 快照supernode/widget(组件、Modifier 与 widget)Glance组件、Modifier

每个路径只导出对应渲染器支持的能力,不支持的用法在类型检查阶段就会报错。widget.show() 还会拒绝从 supernode/app 导入的视图,详见校验与报错。

能力AppWidget
TextField✓—
Hooks 与 Context✓—(组件是纯函数)
fontWeight全部九档normal、medium、bold
DateText 格式date、time、relative、offset、timer(可见时实时更新)date、time(每次渲染格式化一次)
contentScale全部七种crop、fit、fillBounds
单个容器的子节点不限最多 10 个
修饰符顺序按调用顺序生效与顺序无关,每个属性只能设置一次
圆角Modifier.clipModifier.cornerRadius,Android 12(API 31)及以上
撑满剩余空间Modifier.weight(n),任意比例Modifier.defaultWeight(),只能平分

子节点与组件

组件名、prop 名、取值和默认值都与 Jetpack Compose 一致。布局与装饰通过 modifier prop 指定,与 Compose 组件的 modifier 参数一致。

函数组件返回 ViewChild。子节点支持视图、组件、数组、文本、数字、布尔值、null 和 undefined,空节点会被忽略。JSX fragment 用于组合子节点。不支持 <div> 这类字符串标签。列表中的函数组件应使用稳定的 key,以便重排时保留状态。

尺寸与间距的单位为 dp,与 widget.displaySize 一致;文字 fontSize 使用 sp。

颜色取值

所有颜色(background,以及文本和分隔线的 color)都可以传入十六进制字符串,或 { light, dark } 对象分别指定浅色和深色模式的颜色。两种写法都支持 #RRGGBB,也可以用 #AARRGGBB 指定透明度。

<Text color={{ light: "#333333", dark: "#EDEDED" }}>Hello</Text>

对齐取值

Box 的 contentAlignment 取值与 Compose Alignment 一致:"topStart"、"topCenter"、"topEnd"、"centerStart"、"center"、"centerEnd"、"bottomStart"、"bottomCenter"、"bottomEnd"。Column 的 horizontalAlignment 取 "start"、"center" 或 "end",Row 的 verticalAlignment 取 "top"、"center" 或 "bottom"。

start 和 end 跟随布局方向,在从右到左的语言中会互换。

本页目录