import 'package:flutter/material.dart'; import 'glassmorphism_card.dart'; class SkeletonLoading extends StatelessWidget { final double? width; final double? height; final double borderRadius; const SkeletonLoading({ Key? key, this.width, this.height, this.borderRadius = 8.0, }) : super(key: key); @override Widget build(BuildContext context) { // 단일 스켈레톤 아이템이 요청된 경우 if (width != null || height != null) { return _buildSingleSkeleton(); } // 기본 전체 화면 스켈레톤 return Column( children: [ // 요약 카드 스켈레톤 GlassmorphismCard( margin: const EdgeInsets.all(16), padding: const EdgeInsets.all(16.0), blur: 10, opacity: 0.1, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: 100, height: 24, decoration: BoxDecoration( color: Colors.grey[300], borderRadius: BorderRadius.circular(4), ), ), const SizedBox(height: 16), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ _buildSkeletonColumn(), _buildSkeletonColumn(), ], ), ], ), ), // 구독 목록 스켈레톤 Expanded( child: ListView.builder( itemCount: 5, itemBuilder: (context, index) { return GlassmorphismCard( margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), padding: const EdgeInsets.all(16), blur: 10, opacity: 0.1, child: Row( children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: 200, height: 24, decoration: BoxDecoration( color: Colors.grey[300], borderRadius: BorderRadius.circular(4), ), ), const SizedBox(height: 8), Container( width: 150, height: 16, decoration: BoxDecoration( color: Colors.grey[300], borderRadius: BorderRadius.circular(4), ), ), const SizedBox(height: 4), Container( width: 180, height: 16, decoration: BoxDecoration( color: Colors.grey[300], borderRadius: BorderRadius.circular(4), ), ), ], ), ), ], ), ); }, ), ), ], ); } Widget _buildSingleSkeleton() { return Container( width: width, height: height, decoration: BoxDecoration( color: Colors.grey[300], borderRadius: BorderRadius.circular(borderRadius), ), child: AnimatedContainer( duration: const Duration(milliseconds: 1500), decoration: BoxDecoration( borderRadius: BorderRadius.circular(borderRadius), gradient: LinearGradient( begin: Alignment.centerLeft, end: Alignment.centerRight, colors: [ Colors.grey[300]!, Colors.grey[100]!, Colors.grey[300]!, ], ), ), ), ); } Widget _buildSkeletonColumn() { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: 80, height: 16, decoration: BoxDecoration( color: Colors.grey[300], borderRadius: BorderRadius.circular(4), ), ), const SizedBox(height: 4), Container( width: 100, height: 24, decoration: BoxDecoration( color: Colors.grey[300], borderRadius: BorderRadius.circular(4), ), ), ], ); } }