41 lines
857 B
Dart
41 lines
857 B
Dart
typedef NavigationGuardCallback = Future<bool> Function();
|
|
|
|
class NavigationGuard {
|
|
static NavigationGuardCallback? _callback;
|
|
|
|
static void register(NavigationGuardCallback callback) {
|
|
_callback = callback;
|
|
}
|
|
|
|
static void unregister(NavigationGuardCallback callback) {
|
|
if (_callback == callback) {
|
|
_callback = null;
|
|
}
|
|
}
|
|
|
|
static Future<void> attemptNavigation(
|
|
Future<void> Function() performNavigation,
|
|
) async {
|
|
if (_promptActive) return;
|
|
final cb = _callback;
|
|
if (cb == null) {
|
|
await performNavigation();
|
|
return;
|
|
}
|
|
_promptActive = true;
|
|
bool allow = false;
|
|
try {
|
|
allow = await cb();
|
|
} catch (_) {
|
|
allow = false;
|
|
} finally {
|
|
_promptActive = false;
|
|
}
|
|
if (allow) {
|
|
await performNavigation();
|
|
}
|
|
}
|
|
|
|
static bool _promptActive = false;
|
|
}
|