diff --git a/lib/web_ui/lib/src/engine/canvaskit/path_metrics.dart b/lib/web_ui/lib/src/engine/canvaskit/path_metrics.dart index 4f42d0e857f47..f47d08d400c29 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/path_metrics.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/path_metrics.dart @@ -23,6 +23,11 @@ class CkPathMetrics extends IterableBase late final Iterator iterator = _path.isEmpty ? const CkPathMetricIteratorEmpty._() : CkContourMeasureIter(this); + + /// A fresh [CkContourMeasureIter] which is only used for resurrecting a + /// [CkContourMeasure]. We can't use [iterator] here because [iterator] is + /// memoized. + CkContourMeasureIter _iteratorForResurrection() => CkContourMeasureIter(this); } class CkContourMeasureIter extends ManagedSkiaObject @@ -140,8 +145,7 @@ class CkContourMeasure extends ManagedSkiaObject @override SkContourMeasure resurrect() { - final CkContourMeasureIter iterator = - _metrics.iterator as CkContourMeasureIter; + final CkContourMeasureIter iterator = _metrics._iteratorForResurrection(); final SkContourMeasureIter skIterator = iterator.skiaObject; // When resurrecting we must advance the iterator to the last known diff --git a/lib/web_ui/test/canvaskit/path_test.dart b/lib/web_ui/test/canvaskit/path_test.dart index 4aec08ebae67b..bad26e4a9e2d8 100644 --- a/lib/web_ui/test/canvaskit/path_test.dart +++ b/lib/web_ui/test/canvaskit/path_test.dart @@ -45,12 +45,6 @@ void testMain() { path.addOval(const ui.Rect.fromLTRB(10, 10, 100, 100)); expect(path.computeMetrics().length, 2); - // Path metrics can be iterated over multiple times. - final ui.PathMetrics metrics = path.computeMetrics(); - expect(metrics.toList().length, 2); - expect(metrics.toList().length, 2); - expect(metrics.toList().length, 2); - // Can simultaneously iterate over multiple metrics from the same path. final ui.PathMetrics metrics1 = path.computeMetrics(); final ui.PathMetrics metrics2 = path.computeMetrics(); @@ -68,8 +62,7 @@ void testMain() { expect(iter2.moveNext(), isFalse); expect(() => iter1.current, throwsRangeError); expect(() => iter2.current, throwsRangeError); - // TODO(hterkelsen): https://github.com/flutter/flutter/issues/115327 - }, skip: true); + }); test('CkPath.reset', () { final ui.Path path = ui.Path(); @@ -171,8 +164,7 @@ void testMain() { expect(measure0.extractPath(0, 15).getBounds(), const ui.Rect.fromLTRB(0, 0, 10, 5)); expect(measure1.contourIndex, 1); expect(measure1.extractPath(0, 15).getBounds(), const ui.Rect.fromLTRB(20, 20, 30, 25)); - // TODO(hterkelsen): https://github.com/flutter/flutter/issues/115327 - }, skip: true); + }); test('Path.from', () { const ui.Rect rect1 = ui.Rect.fromLTRB(0, 0, 10, 10);