一个Path转虚线的扩展
java
extension DashedPathExtension on Path {
/// 转换为虚线 Path(安全版)
/// [solidLength]:实线段长度(像素)
/// [gapLength]:空线段长度(像素)
/// 返回:新的虚线 Path(原 Path 不变)
Path toDashedPath({
required double solidLength,
required double gapLength,
}) {
// 前置参数校验
assert(solidLength > 0, "实线段长度必须大于0");
assert(gapLength >= 0, "空线段长度不能为负数");
// 1. 安全获取 PathMetrics 并校验
//final PathMetrics metrics = computeMetrics();
// // 校验1:PathMetrics 为空 → 返回空 Path
//if (metrics.isEmpty) return Path();
// 2. 遍历 metrics(兼容多段路径),避免 first 直接报错
final Path dashedPath = Path();
for (final PathMetric metric in computeMetrics()) {
final double totalLength = metric.length;
// 校验2:单段路径长度为0 → 跳过
if (totalLength <= 0) continue;
// 3. 循环绘制实线段(始终从实线开始)
double currentDistance = 0.0;
while (currentDistance < totalLength) {
final double solidEnd = currentDistance + solidLength;
final double actualEnd = solidEnd > totalLength ? totalLength : solidEnd;
// 提取实线段并添加到虚线 Path
final Path segment = metric.extractPath(currentDistance, actualEnd);
dashedPath.addPath(segment, Offset.zero);
// 跳过空线段
currentDistance = solidEnd + gapLength;
}
}
return dashedPath;
}
}
注意点是这个
js
// 1. 安全获取 PathMetrics 并校验
// final PathMetrics metrics = computeMetrics();
// // // 校验1:PathMetrics 为空 → 返回空 Path
// if (metrics.isEmpty) return Path();
这里调用了 metrics.isEmpty()
js
bool get isEmpty => !iterator.moveNext();
也就是调用了迭代器的moveNext() 再次遍历metrics 就会从第二个元素开始。 如果迭代器本身只有一个元素,这个时候调用metrics.first 救护报错no element。