aves/lib/widgets/common/behaviour/pop/scope.dart
2024-07-13 01:32:30 +02:00

54 lines
1.3 KiB
Dart

import 'package:collection/collection.dart';
import 'package:flutter/widgets.dart';
// this widget combines multiple pop handlers with a guaranteed order
class AvesPopScope extends StatelessWidget {
final List<PopHandler> handlers;
final Widget child;
const AvesPopScope({
super.key,
required this.handlers,
required this.child,
});
@override
Widget build(BuildContext context) {
final blocker = handlers.firstWhereOrNull((v) => !v.canPop(context));
return PopScope(
canPop: blocker == null,
onPopInvoked: (didPop) {
if (!didPop) {
blocker?.onPopBlocked(context);
}
},
child: child,
);
}
}
abstract class PopHandler {
bool canPop(BuildContext context);
void onPopBlocked(BuildContext context);
}
class APopHandler implements PopHandler {
final bool Function(BuildContext context) _canPop;
final void Function(BuildContext context) _onPopBlocked;
APopHandler({
required bool Function(BuildContext context) canPop,
required void Function(BuildContext context) onPopBlocked,
}) : _canPop = canPop,
_onPopBlocked = onPopBlocked;
@override
bool canPop(BuildContext context) => _canPop(context);
@override
void onPopBlocked(BuildContext context) => _onPopBlocked(context);
}
@immutable
class PopExitNotification extends Notification {}