import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:ainoval/utils/web_theme.dart'; /// 全屏加载动画覆盖层 /// 在应用初始化、卷轴切换等耗时操作时显示 class FullscreenLoadingOverlay extends StatelessWidget { final String loadingMessage; final bool showProgressIndicator; final double progress; // 0.0 - 1.0 的进度值,如果提供将显示进度条而非无限循环指示器 final Color? backgroundColor; final Color textColor; final bool useBlur; // 是否使用背景模糊效果 final bool isVisible; const FullscreenLoadingOverlay({ Key? key, this.loadingMessage = '正在加载,请稍候...', this.showProgressIndicator = true, this.progress = -1, // 默认为-1,表示不确定进度 this.backgroundColor, this.textColor = Colors.black87, this.useBlur = false, this.isVisible = true, }) : super(key: key); @override Widget build(BuildContext context) { if (!isVisible) return const SizedBox.shrink(); final screenSize = MediaQuery.of(context).size; final theme = Theme.of(context); return Positioned.fill( child: Material( color: Colors.transparent, child: Container( // 使用动态背景色 color: backgroundColor ?? WebTheme.getBackgroundColor(context), child: Center( child: Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ if (showProgressIndicator) SizedBox( width: 60, height: 60, child: CircularProgressIndicator( strokeWidth: 4, valueColor: AlwaysStoppedAnimation( theme.primaryColor, ), ), ), if (showProgressIndicator && (loadingMessage != null || progress > 0)) const SizedBox(height: 30), if (loadingMessage != null) Padding( padding: const EdgeInsets.symmetric(horizontal: 40), child: Text( loadingMessage, style: const TextStyle( fontSize: 18, fontWeight: FontWeight.w500, color: Colors.black87, ), textAlign: TextAlign.center, ), ), if (progress > 0) Padding( padding: const EdgeInsets.only(top: 10), child: _buildProgressIndicator(theme), ), ], ), ), ), ), ); } // 构建进度指示器 Widget _buildProgressIndicator(ThemeData theme) { return Column( mainAxisSize: MainAxisSize.min, children: [ Text( '${(progress * 100).toStringAsFixed(0)}%', style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w500, color: Colors.black54, ), ), const SizedBox(height: 10), SizedBox( width: 200, child: LinearProgressIndicator( value: progress, backgroundColor: Colors.grey[200], valueColor: AlwaysStoppedAnimation( theme.primaryColor, ), minHeight: 6, borderRadius: BorderRadius.circular(3), ), ), ], ); } }