miuixParsePath function

Path miuixParsePath(
  1. String data, {
  2. PathFillType fillType = PathFillType.nonZero,
})

从 SVG 风格的路径数据字符串解析出 Path

用于扩展图标(miuix-icons,156×5 个变体):Kotlin 端的 PathNode 列表在生成时 被压成紧凑字符串,运行时由本函数还原,避免每个图标产出大量 Dart 代码。

支持的命令(仅绝对坐标,与 miuix 扩展图标一致): M x y 移动、L x y 直线、Q x1 y1 x y 二次贝塞尔、 C x1 y1 x2 y2 x y 三次贝塞尔、Z 闭合。数字以空白分隔,命令字母单独成 token。

注意:Compose 的 HorizontalTo/VerticalTo 在生成阶段已被展开为完整的 L x y (生成器跟踪当前点),因此这里无需处理 H/V。fillType 默认非零环绕(NonZero)。

Implementation

Path miuixParsePath(String data, {PathFillType fillType = PathFillType.nonZero}) {
  final path = Path()..fillType = fillType;
  final tokens = data.split(RegExp(r'\s+')).where((t) => t.isNotEmpty).toList();
  int i = 0;
  double num() => double.parse(tokens[i++]);
  while (i < tokens.length) {
    final cmd = tokens[i++];
    switch (cmd) {
      case 'M':
        path.moveTo(num(), num());
      case 'L':
        path.lineTo(num(), num());
      case 'Q':
        path.quadraticBezierTo(num(), num(), num(), num());
      case 'C':
        path.cubicTo(num(), num(), num(), num(), num(), num());
      case 'Z':
        path.close();
      default:
        throw FormatException('miuixParsePath: 未知命令 "$cmd"', data);
    }
  }
  return path;
}