Files
ReelShort/lib/pages/player/widgets/player_heart_overlay_scope.dart

53 lines
1.2 KiB
Dart

// 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<int, OverlayEntry> _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<PlayerHeartOverlayScope>()
?.controller;
}
@override
bool updateShouldNotify(PlayerHeartOverlayScope oldWidget) {
return controller != oldWidget.controller;
}
}