fix(ui): preserve mobile home route and confirm Android exit

This commit is contained in:
Levi committed 2026-09-12 18:56:52 +08:00
1 parent 8f9bac9e6b
commit ee6b073bc1
7 files changed
+307 -66

No files matched your search

@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
@@ -7,18 +9,37 @@ import '../widgets/app_toast.dart';
class AppExitConfirmationController {
static const confirmationWindow = Duration(seconds: 2);
DateTime? _lastBackAt;
OverlayEntry? _toast;
Timer? _timer;
Future<void> handleBack(BuildContext context) async {
final now = DateTime.now();
final lastBackAt = _lastBackAt;
if (lastBackAt != null && now.difference(lastBackAt) <= confirmationWindow) {
_lastBackAt = null;
if (_toast != null) {
dispose();
await SystemNavigator.pop();
return;
}
_lastBackAt = now;
showAppToast(context, context.l10n.pressBackAgainToExit);
final message = context.l10n.pressBackAgainToExit;
final themes = InheritedTheme.capture(from: context, to: Overlay.of(context, rootOverlay: true).context);
_toast = OverlayEntry(
builder: (_) => IgnorePointer(
child: Center(
child: Padding(
padding: const EdgeInsets.all(24),
child: themes.wrap(AppToastContent(message: message)),
),
),
),
);
Overlay.of(context, rootOverlay: true).insert(_toast!);
_timer = Timer(confirmationWindow, dispose);
}
void dispose() {
_timer?.cancel();
_timer = null;
_toast?.remove();
_toast?.dispose();
_toast = null;
}
}