// Author: fruit.com.cn import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; /// Tracks heart overlays for the lifetime of one player page. class PlayerHeartOverlayController { final Map _entries = {}; void track(int id, OverlayEntry entry) { _entries[id] = entry; } void untrack(int id) { _entries.remove(id); } void dispose() { for (final entry in _entries.entries.toList()) { if (entry.value.mounted) entry.value.remove(); entry.value.dispose(); if (kDebugMode) { debugPrint( '[player] phase=heart-burst-entry-removed ' 'id=${entry.key} reason=page-dispose', ); } } _entries.clear(); } } class PlayerHeartOverlayScope extends InheritedWidget { const PlayerHeartOverlayScope({ super.key, required this.controller, required super.child, }); final PlayerHeartOverlayController controller; static PlayerHeartOverlayController? maybeOf(BuildContext context) { return context .dependOnInheritedWidgetOfExactType() ?.controller; } @override bool updateShouldNotify(PlayerHeartOverlayScope oldWidget) { return controller != oldWidget.controller; } }