import 'package:flutter/material.dart'; import '../constants/app_colors.dart'; /// 로딩 인디케이터 위젯 /// /// 앱 전체에서 일관된 로딩 표시를 위한 공통 위젯 class LoadingIndicator extends StatelessWidget { /// 로딩 메시지 (선택사항) final String? message; /// 인디케이터 크기 final double size; /// 스트로크 너비 final double strokeWidth; const LoadingIndicator({ super.key, this.message, this.size = 40.0, this.strokeWidth = 4.0, }); @override Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ SizedBox( width: size, height: size, child: CircularProgressIndicator( strokeWidth: strokeWidth, valueColor: AlwaysStoppedAnimation( isDark ? AppColors.darkPrimary : AppColors.lightPrimary, ), ), ), if (message != null) ...[ const SizedBox(height: 16), Text( message!, style: TextStyle( fontSize: 14, color: isDark ? AppColors.darkTextSecondary : AppColors.lightTextSecondary, ), textAlign: TextAlign.center, ), ], ], ), ); } } /// 전체 화면 로딩 인디케이터 /// /// 화면 전체를 덮는 로딩 표시를 위한 위젯 class FullScreenLoadingIndicator extends StatelessWidget { /// 로딩 메시지 (선택사항) final String? message; /// 배경 투명도 final double backgroundOpacity; const FullScreenLoadingIndicator({ super.key, this.message, this.backgroundOpacity = 0.5, }); @override Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; return Container( color: (isDark ? Colors.black : Colors.white) .withValues(alpha: backgroundOpacity), child: LoadingIndicator(message: message), ); } }