SuperNode
Widget

Modifier

桌面小组件中与顺序无关的布局与装饰。

布局与装饰通过 modifier prop 指定。从 supernode/widget 导入 Modifier,链式调用即可构造。小组件渲染成 RemoteViews,每个属性只能有一个值,因此小组件的修饰符与顺序无关,详见顺序。

import { Modifier, Text } from "supernode/widget";

<Text modifier={Modifier.fillMaxWidth().background("#FFFFFF").cornerRadius(12).padding(16)}>
  Hello
</Text>
修饰符行为
padding(all) / padding({ start, top, end, bottom }) / padding({ horizontal, vertical })在背景内侧留出空白,多次调用会累加。
width(dp) / height(dp) / size(dp) / size(width, height)设置固定尺寸。
fillMaxWidth() / fillMaxHeight() / fillMaxSize()占满父容器,不支持比例。
defaultWeight()平分 Column 或 Row 的剩余空间,详见 defaultWeight。
background(color)绘制背景,详见颜色取值。
cornerRadius(radius)圆角,详见圆角。
append(other)拼接另一条链,详见组合修饰符。

与 Compose 的 Modifier.padding 一致,padding 可以是一个数字(四边相同),也可以是四边对象 { start, top, end, bottom } 或方向对象 { horizontal, vertical },同一个对象不能混用两种写法。start 和 end 跟随布局方向。数值单位为 dp,与 widget.displaySize 一致。视图默认按内容自适应大小。

顺序

padding 总在背景内侧,多次 padding 会累加。background、cornerRadius、宽度(width、size、fillMaxWidth、fillMaxSize,以及 Row 中的 defaultWeight())和高度(height、size、fillMaxHeight、fillMaxSize,以及 Column 中的 defaultWeight())在一条链上都只能设置一次,重复设置时 widget.show() 会带着视图路径报错。

<Column>
  {/* 两条链效果相同:padding 都是内边距。 */}
  <Text modifier={Modifier.padding(8).background("#FFE0E0")}>内边距</Text>
  <Text modifier={Modifier.background("#FFE0E0").padding(8)}>内边距</Text>
</Column>

需要在背景外侧留白时,用带 padding 的 Box 包裹视图。

defaultWeight

defaultWeight() 是 Glance 唯一支持的 weight 形式:Row 或 Column 中所有设置了 defaultWeight() 的子视图平分主轴上的剩余空间。它只能用在 Column 和 Row 的直接子视图上(fragment 的子视图视为外层容器的子视图)。它在 Row 中设置宽度、在 Column 中设置高度,因此不能和同一主轴上的其他宽度或高度同时使用。

import { Modifier, Row, Spacer, Text } from "supernode/widget";

<Row verticalAlignment="center" modifier={Modifier.fillMaxWidth().padding(16)}>
  <Text>标题</Text>
  {/* 把“编辑”推到行尾。 */}
  <Spacer modifier={Modifier.defaultWeight()} />
  <Text>编辑</Text>
</Row>

圆角

cornerRadius(radius) 为视图的背景和内容设置圆角,仅在 Android 12(API 31)及以上生效,更早的版本显示直角。

组合修饰符

修饰符是不可变的,每次调用都返回新链。用 append 把父组件传入的 modifier 与自己的修饰组合起来,或者按条件追加修饰。append 只接受从 supernode/widget 导入的 Modifier。

import { Modifier, Text } from "supernode/widget";

function Tag({ label, selected, modifier = Modifier }: { label: string; selected: boolean; modifier?: Modifier }) {
  return (
    <Text modifier={modifier.padding({ horizontal: 8, vertical: 4 }).append(selected ? Modifier.background("#E0F0FF") : Modifier)}>
      {label}
    </Text>
  );
}

本页目录