From 65177cb7b24f8be8ffbcd80f821d8686530dc179 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Fri, 31 Jan 2025 10:11:04 -0800 Subject: [PATCH] [vector_graphics] Revert leak tracker change (#8544) The leak tracker changes are causing runtime crashes because an object is disposed too eagerly. Fixes https://github.com/flutter/flutter/issues/162486 --- packages/vector_graphics/CHANGELOG.md | 4 ++++ packages/vector_graphics/lib/src/listener.dart | 8 ++++---- .../lib/src/render_vector_graphic.dart | 1 - .../vector_graphics/lib/src/vector_graphics.dart | 8 +++----- packages/vector_graphics/pubspec.yaml | 3 +-- .../vector_graphics/test/flutter_test_config.dart | 13 ------------- .../vector_graphics/test/vector_graphics_test.dart | 10 +++------- 7 files changed, 15 insertions(+), 32 deletions(-) delete mode 100644 packages/vector_graphics/test/flutter_test_config.dart diff --git a/packages/vector_graphics/CHANGELOG.md b/packages/vector_graphics/CHANGELOG.md index 6f716f9fc717..4367b1451186 100644 --- a/packages/vector_graphics/CHANGELOG.md +++ b/packages/vector_graphics/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.17 + +* Reverts leaker tracker changes that caused runtime exceptions. + ## 1.1.16 * Fixes some memory leaks by disposing undisposed `ImageInfo`, `ui.Picture` and `Picture`. diff --git a/packages/vector_graphics/lib/src/listener.dart b/packages/vector_graphics/lib/src/listener.dart index 6790e34843f1..f266de4fb4a2 100644 --- a/packages/vector_graphics/lib/src/listener.dart +++ b/packages/vector_graphics/lib/src/listener.dart @@ -252,7 +252,7 @@ class FlutterVectorGraphicsListener extends VectorGraphicsCodecListener { final List<_TextConfig> _textConfig = <_TextConfig>[]; final List<_TextPosition> _textPositions = <_TextPosition>[]; final List> _pendingImages = >[]; - final Map _images = {}; + final Map _images = {}; final Map _patterns = {}; Path? _currentPath; Size _size = Size.zero; @@ -283,7 +283,7 @@ class FlutterVectorGraphicsListener extends VectorGraphicsCodecListener { try { return PictureInfo._(_recorder.endRecording(), _size); } finally { - for (final ImageInfo image in _images.values) { + for (final Image image in _images.values) { image.dispose(); } _images.clear(); @@ -746,7 +746,7 @@ class FlutterVectorGraphicsListener extends VectorGraphicsCodecListener { listener = ImageStreamListener( (ImageInfo image, bool synchronousCall) { cacheCompleter.removeListener(listener); - _images[imageId] = image; + _images[imageId] = image.image; completer.complete(); }, onError: (Object exception, StackTrace? stackTrace) { @@ -773,7 +773,7 @@ class FlutterVectorGraphicsListener extends VectorGraphicsCodecListener { @override void onDrawImage(int imageId, double x, double y, double width, double height, Float64List? transform) { - final Image image = _images[imageId]!.image; + final Image image = _images[imageId]!; if (transform != null) { _canvas.save(); _canvas.transform(transform); diff --git a/packages/vector_graphics/lib/src/render_vector_graphic.dart b/packages/vector_graphics/lib/src/render_vector_graphic.dart index 9bd6bf9b564d..a6b530469e5b 100644 --- a/packages/vector_graphics/lib/src/render_vector_graphic.dart +++ b/packages/vector_graphics/lib/src/render_vector_graphic.dart @@ -213,7 +213,6 @@ class RenderVectorGraphic extends RenderBox { final ui.Image pending = rasterPicture.toImageSync(scaledWidth, scaledHeight); - rasterPicture.dispose(); return RasterData(pending, 0, key); } diff --git a/packages/vector_graphics/lib/src/vector_graphics.dart b/packages/vector_graphics/lib/src/vector_graphics.dart index 2d8b1c6796a3..c849a81dd09d 100644 --- a/packages/vector_graphics/lib/src/vector_graphics.dart +++ b/packages/vector_graphics/lib/src/vector_graphics.dart @@ -340,10 +340,8 @@ class _VectorGraphicWidgetState extends State { return; } data.count -= 1; - if (data.count == 0) { - if (_livePictureCache.containsKey(data.key)) { - _livePictureCache.remove(data.key); - } + if (data.count == 0 && _livePictureCache.containsKey(data.key)) { + _livePictureCache.remove(data.key); data.pictureInfo.picture.dispose(); } } @@ -384,7 +382,7 @@ class _VectorGraphicWidgetState extends State { } Future _loadAssetBytes() async { - // First check if we have an available picture and use this immediately. + // First check if we have an avilable picture and use this immediately. final Object loaderKey = widget.loader.cacheKey(context); final _PictureKey key = _PictureKey(loaderKey, locale, textDirection, widget.clipViewbox); diff --git a/packages/vector_graphics/pubspec.yaml b/packages/vector_graphics/pubspec.yaml index af4e4017f7f8..688f3bf93c58 100644 --- a/packages/vector_graphics/pubspec.yaml +++ b/packages/vector_graphics/pubspec.yaml @@ -2,7 +2,7 @@ name: vector_graphics description: A vector graphics rendering package for Flutter using a binary encoding. repository: https://github.com/flutter/packages/tree/main/packages/vector_graphics issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+vector_graphics%22 -version: 1.1.16 +version: 1.1.17 environment: sdk: ^3.4.0 @@ -17,7 +17,6 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - leak_tracker_flutter_testing: any vector_graphics_compiler: ^1.1.11+1 platforms: diff --git a/packages/vector_graphics/test/flutter_test_config.dart b/packages/vector_graphics/test/flutter_test_config.dart deleted file mode 100644 index 9907e578b84b..000000000000 --- a/packages/vector_graphics/test/flutter_test_config.dart +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart'; - -Future testExecutable(FutureOr Function() testMain) async { - LeakTesting.enable(); - LeakTracking.warnForUnsupportedPlatforms = false; - await testMain(); -} diff --git a/packages/vector_graphics/test/vector_graphics_test.dart b/packages/vector_graphics/test/vector_graphics_test.dart index f8b034d9dbae..8d8bc7fcb12b 100644 --- a/packages/vector_graphics/test/vector_graphics_test.dart +++ b/packages/vector_graphics/test/vector_graphics_test.dart @@ -442,9 +442,7 @@ void main() { ); await tester.pumpAndSettle(); - final PictureInfo picture = await completer.future; - addTearDown(picture.picture.dispose); - expect(picture, isA()); + expect(await completer.future, isA()); expect(debugLastLocale, const Locale('fr', 'CH')); expect(debugLastTextDirection, TextDirection.rtl); }); @@ -477,9 +475,7 @@ void main() { ); await tester.pumpAndSettle(); - final PictureInfo picture = await completer.future; - addTearDown(picture.picture.dispose); - expect(picture, isA()); + expect(await completer.future, isA()); expect(debugLastLocale, PlatformDispatcher.instance.locale); expect(debugLastTextDirection, TextDirection.ltr); }); @@ -588,7 +584,7 @@ void main() { expect(imageCache.statusForKey(imageKey).live, false); expect(imageCache.statusForKey(imageKey).keepAlive, true); - // A blue square, because the image is available now. + // A blue square, becuase the image is available now. await expectLater( find.byKey(key), matchesGoldenFile('vg_with_image_blue.png'),