From 5985a89f8503245e08544c9e2d20f4cf13789eed Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sat, 26 Oct 2024 01:27:02 +0200 Subject: [PATCH] leaks: overlay entry review, change notifier mixin creation event --- lib/model/favourites.dart | 4 +++- lib/model/highlight.dart | 4 ++++ lib/model/query.dart | 1 + lib/model/selection.dart | 4 ++++ lib/model/settings/settings.dart | 6 +++-- lib/model/source/collection_lens.dart | 1 + lib/model/vaults/vaults.dart | 5 ++++- .../quick_choosers/common/button.dart | 8 +++---- lib/widgets/common/fx/blurred.dart | 2 ++ lib/widgets/common/grid/scaling.dart | 8 +++---- lib/widgets/debug/general.dart | 22 ++++++++++++++----- .../viewer/visual/entry_page_view.dart | 8 +++---- 12 files changed, 49 insertions(+), 24 deletions(-) diff --git a/lib/model/favourites.dart b/lib/model/favourites.dart index 1f4acd185..b54bff4ef 100644 --- a/lib/model/favourites.dart +++ b/lib/model/favourites.dart @@ -12,7 +12,9 @@ final Favourites favourites = Favourites._private(); class Favourites with ChangeNotifier { Set _rows = {}; - Favourites._private(); + Favourites._private() { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + } Future init() async { _rows = await localMediaDb.loadAllFavourites(); diff --git a/lib/model/highlight.dart b/lib/model/highlight.dart index 7a9c94de0..2d372eb4a 100644 --- a/lib/model/highlight.dart +++ b/lib/model/highlight.dart @@ -5,6 +5,10 @@ import 'package:flutter/painting.dart'; class HighlightInfo extends ChangeNotifier { final EventBus eventBus = EventBus(); + HighlightInfo() { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + } + void trackItem( T? item, { TrackPredicate? predicate, diff --git a/lib/model/query.dart b/lib/model/query.dart index 518d6941f..fa468f129 100644 --- a/lib/model/query.dart +++ b/lib/model/query.dart @@ -9,6 +9,7 @@ class Query extends ChangeNotifier { final StreamController _enabledStreamController = StreamController.broadcast(); Query({required bool enabled, required String? initialValue}) { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); _enabled = enabled; if (initialValue != null && initialValue.isNotEmpty) { _enabled = true; diff --git a/lib/model/selection.dart b/lib/model/selection.dart index b49ffdc0d..fbb6014b7 100644 --- a/lib/model/selection.dart +++ b/lib/model/selection.dart @@ -9,6 +9,10 @@ class Selection extends ChangeNotifier { Set get selectedItems => _selectedItems; + Selection() { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + } + void browse() { if (!_isSelecting) return; _isSelecting = false; diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 68c9ed0e2..088bfa415 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -33,8 +33,8 @@ import 'package:aves_utils/aves_utils.dart'; import 'package:aves_video/aves_video.dart'; import 'package:collection/collection.dart'; import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; -import 'package:flutter/widgets.dart'; import 'package:latlong2/latlong.dart'; final Settings settings = Settings._private(); @@ -56,7 +56,9 @@ class Settings with ChangeNotifier, SettingsAccess, AppSettings, DisplaySettings @override SettingsStore get store => settingsStore; - Settings._private(); + Settings._private() { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + } Future init({required bool monitorPlatformSettings}) async { await store.init(); diff --git a/lib/model/source/collection_lens.dart b/lib/model/source/collection_lens.dart index 31d21093f..f7976bdca 100644 --- a/lib/model/source/collection_lens.dart +++ b/lib/model/source/collection_lens.dart @@ -59,6 +59,7 @@ class CollectionLens with ChangeNotifier { sectionFactor = settings.collectionSectionFactor, sortFactor = settings.collectionSortFactor, sortReverse = settings.collectionSortReverse { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); id ??= hashCode; if (listenToSource) { final sourceEvents = source.eventBus; diff --git a/lib/model/vaults/vaults.dart b/lib/model/vaults/vaults.dart index 8de46f089..718b1cd49 100644 --- a/lib/model/vaults/vaults.dart +++ b/lib/model/vaults/vaults.dart @@ -8,6 +8,7 @@ import 'package:aves/model/vaults/details.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves_screen_state/aves_screen_state.dart'; import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; @@ -20,7 +21,9 @@ class Vaults extends ChangeNotifier { static const _fileScheme = 'file'; - Vaults._private(); + Vaults._private() { + if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this); + } Future init() async { _rows = await localMediaDb.loadAllVaults(); diff --git a/lib/widgets/common/action_controls/quick_choosers/common/button.dart b/lib/widgets/common/action_controls/quick_choosers/common/button.dart index 5925099b7..8ada58a26 100644 --- a/lib/widgets/common/action_controls/quick_choosers/common/button.dart +++ b/lib/widgets/common/action_controls/quick_choosers/common/button.dart @@ -99,12 +99,10 @@ abstract class ChooserQuickButtonState, U> exten } void _clearChooserOverlayEntry() { - final overlayEntry = _chooserOverlayEntry; + _chooserOverlayEntry + ?..remove() + ..dispose(); _chooserOverlayEntry = null; - if (overlayEntry != null) { - overlayEntry.remove(); - overlayEntry.dispose(); - } } void _showChooser(LongPressStartDetails details) { diff --git a/lib/widgets/common/fx/blurred.dart b/lib/widgets/common/fx/blurred.dart index bb20869b0..c20fd1d4f 100644 --- a/lib/widgets/common/fx/blurred.dart +++ b/lib/widgets/common/fx/blurred.dart @@ -7,6 +7,8 @@ final _filter = ImageFilter.blur(sigmaX: 4, sigmaY: 4); // as it yields performance issues when there are other layers on top final _identity = ImageFilter.matrix(Matrix4.identity().storage); +// TODO TLAD [impeller] use `BackdropKey` + class BlurredRect extends StatelessWidget { final bool enabled; final Widget child; diff --git a/lib/widgets/common/grid/scaling.dart b/lib/widgets/common/grid/scaling.dart index 87d2cb98c..fe29b4bf3 100644 --- a/lib/widgets/common/grid/scaling.dart +++ b/lib/widgets/common/grid/scaling.dart @@ -196,12 +196,10 @@ class _GridScaleGestureDetectorState extends State(); diff --git a/lib/widgets/debug/general.dart b/lib/widgets/debug/general.dart index 87ed6aee4..704dd6be5 100644 --- a/lib/widgets/debug/general.dart +++ b/lib/widgets/debug/general.dart @@ -47,12 +47,10 @@ class _DebugGeneralSectionState extends State with Automati SwitchListTile( value: _taskQueueOverlayEntry != null, onChanged: (v) { - final overlayEntry = _taskQueueOverlayEntry; + _taskQueueOverlayEntry + ?..remove() + ..dispose(); _taskQueueOverlayEntry = null; - if (overlayEntry != null) { - overlayEntry.remove(); - overlayEntry.dispose(); - } if (v) { _taskQueueOverlayEntry = OverlayEntry( builder: (context) => const DebugTaskQueueOverlay(), @@ -63,6 +61,20 @@ class _DebugGeneralSectionState extends State with Automati }, title: const Text('Show tasks overlay'), ), + ElevatedButton( + onPressed: () => LeakTracking.collectLeaks().then((leaks) { + const config = LeakDiagnosticConfig( + collectRetainingPathForNotGCed: true, + collectStackTraceOnStart: true, + collectStackTraceOnDisposal: true, + ); + LeakTracking.phase = const PhaseSettings( + leakDiagnosticConfig: config, + ); + debugPrint('Setup leak tracking phase with config=$config'); + }), + child: const Text('Setup leak tracking phase'), + ), ElevatedButton( onPressed: () => LeakTracking.collectLeaks().then((leaks) { leaks.byType.forEach((type, reports) { diff --git a/lib/widgets/viewer/visual/entry_page_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart index 6098b07ec..0f23b68be 100644 --- a/lib/widgets/viewer/visual/entry_page_view.dart +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -310,12 +310,10 @@ class _EntryPageViewState extends State with TickerProviderStateM onScaleEnd = (details) { valueNotifier?.dispose(); - final overlayEntry = _actionFeedbackOverlayEntry; + _actionFeedbackOverlayEntry + ?..remove() + ..dispose(); _actionFeedbackOverlayEntry = null; - if (overlayEntry != null) { - overlayEntry.remove(); - overlayEntry.dispose(); - } }; }