This commit is contained in:
DESKTOP-I3JPKHK\wy 2025-11-25 19:25:36 +08:00
parent f7d44c9a34
commit 98cdfe7fb6
1 changed files with 154 additions and 39 deletions

View File

@ -518,51 +518,101 @@ class AppUpgradeSimple {
); );
} }
/// 使 Overlay Toast Scaffold
void _showOverlayToast(BuildContext context, String message, UpgradeConfig config) {
if (!context.mounted) {
debugPrint('Toast消息context已卸载: $message');
return;
}
try {
final overlay = Overlay.of(context);
// OverlayEntry
final overlayEntry = OverlayEntry(
builder: (context) => _ToastWidget(message: message),
);
// Overlay
overlay.insert(overlayEntry);
// 2
Future.delayed(const Duration(seconds: 2), () {
try {
overlayEntry.remove();
} catch (e) {
//
if (config.enableDebugLog) {
debugPrint('移除Toast失败: $e');
}
}
});
} catch (e) {
debugPrint('显示Toast失败: $e');
debugPrint('Toast消息: $message');
}
}
/// 使 ScaffoldMessenger SnackBar
void _tryShowSnackBar(BuildContext context, String message, UpgradeConfig config) {
if (!context.mounted) {
_showOverlayToast(context, message, config);
return;
}
// ScaffoldMessenger
final scaffoldMessenger = ScaffoldMessenger.maybeOf(context);
if (scaffoldMessenger == null) {
// ScaffoldMessenger使 Overlay Toast
_showOverlayToast(context, message, config);
return;
}
// 使 Navigator context
BuildContext? rootContext;
try {
final navigator = Navigator.maybeOf(context, rootNavigator: true);
if (navigator != null) {
rootContext = navigator.context;
}
} catch (e) {
// 使 context
}
// 使 context ScaffoldMessenger
final messenger =
rootContext != null && rootContext.mounted ? ScaffoldMessenger.maybeOf(rootContext) : scaffoldMessenger;
if (messenger == null) {
_showOverlayToast(context, message, config);
return;
}
// SnackBar使 Overlay Toast
try {
messenger.showSnackBar(
SnackBar(
content: Text(message),
duration: Duration(seconds: 2),
),
);
} catch (e) {
// SnackBar 使 Overlay Toast
if (config.enableDebugLog) {
debugPrint('SnackBar显示失败使用Overlay Toast: $e');
}
_showOverlayToast(context, message, config);
}
}
/// Toast提示 /// Toast提示
void _showToast(String message, BuildContext context, [UpgradeConfig? config]) { void _showToast(String message, BuildContext context, [UpgradeConfig? config]) {
final effectiveConfig = config ?? _config; final effectiveConfig = config ?? _config;
if (effectiveConfig.customToast != null) { if (effectiveConfig.customToast != null) {
effectiveConfig.customToast!(message); effectiveConfig.customToast!(message);
} else { } else {
// context // 使 SnackBar使 Overlay Toast
if (!context.mounted) { _tryShowSnackBar(context, message, effectiveConfig);
debugPrint('Toast消息context已卸载: $message');
return;
}
// Scaffold widget
final scaffold = Scaffold.maybeOf(context);
if (scaffold == null) {
// Scaffold使 debugPrint
debugPrint('Toast消息无Scaffold: $message');
return;
}
// 使 maybeOf ScaffoldMessenger
final scaffoldMessenger = ScaffoldMessenger.maybeOf(context);
if (scaffoldMessenger == null) {
// ScaffoldMessenger使 debugPrint
debugPrint('Toast消息无ScaffoldMessenger: $message');
return;
}
// 使 Scaffold ScaffoldMessenger
// 使 try-catch
try {
scaffoldMessenger.showSnackBar(
SnackBar(
content: Text(message),
duration: Duration(seconds: 2),
),
);
} catch (e) {
//
//
debugPrint('显示Toast失败已使用后备方案: $message');
if (effectiveConfig.enableDebugLog) {
debugPrint('错误详情: $e');
}
}
} }
} }
@ -2053,3 +2103,68 @@ class _ForceUpgradeDialogState extends State<_ForceUpgradeDialog> with _UpgradeD
); );
} }
} }
/// 使 Overlay Toast Widget Scaffold
class _ToastWidget extends StatelessWidget {
final String message;
const _ToastWidget({required this.message});
@override
Widget build(BuildContext context) {
return Positioned(
top: MediaQuery.of(context).padding.top + 16,
left: 16,
right: 16,
child: Material(
color: Colors.transparent,
child: SafeArea(
child: IgnorePointer(
child: TweenAnimationBuilder<double>(
duration: const Duration(milliseconds: 300),
tween: Tween(begin: 0.0, end: 1.0),
builder: (context, value, child) {
return Opacity(
opacity: value,
child: Transform.translate(
offset: Offset(0, -20 * (1 - value)),
child: child,
),
);
},
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
decoration: BoxDecoration(
color: Colors.black87,
borderRadius: BorderRadius.circular(8),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.2),
blurRadius: 8,
offset: const Offset(0, 4),
),
],
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Flexible(
child: Text(
message,
style: const TextStyle(
color: Colors.white,
fontSize: 14,
),
textAlign: TextAlign.center,
),
),
],
),
),
),
),
),
),
);
}
}