53 lines
1.2 KiB
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;
|
|
}
|
|
}
|