import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:shimmer/shimmer.dart'; final _logger = Logger('StreamioShimmer'); class StreamioShimmer extends StatelessWidget { final String? image; final String tag; const StreamioShimmer({ super.key, this.image, required this.tag, }); @override Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; final screenSize = MediaQuery.of(context).size; return Stack( children: [ Container( width: screenSize.width, height: screenSize.height, color: colorScheme.surface, ), SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( height: screenSize.height * 0.65, child: Padding( padding: const EdgeInsets.all(16.0), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Expanded( flex: 2, child: Stack( children: [ Container( constraints: const BoxConstraints( maxHeight: 220, ), decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), color: colorScheme.surface, ), ), Hero( tag: tag, child: Container( constraints: const BoxConstraints( maxHeight: 220, ), decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), image: image != null ? DecorationImage( image: CachedNetworkImageProvider( image!), fit: BoxFit.cover, ) : null, ), ), ), ], ), ), const SizedBox(width: 16), Expanded( flex: 3, child: Shimmer.fromColors( baseColor: colorScheme.surfaceContainerHighest, highlightColor: colorScheme.surface, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Container( height: 48, decoration: BoxDecoration( color: colorScheme.surface, borderRadius: BorderRadius.circular(4), ), ), const SizedBox(height: 8), Container( height: 24, width: 200, decoration: BoxDecoration( color: colorScheme.surface, borderRadius: BorderRadius.circular(4), ), ), const SizedBox(height: 16), Container( height: 32, width: 120, decoration: BoxDecoration( color: colorScheme.surface, borderRadius: BorderRadius.circular(4), ), ), ], ), ), ), ], ), ), ), Shimmer.fromColors( baseColor: colorScheme.surfaceContainerHighest, highlightColor: colorScheme.surface, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: List.generate( 3, (index) => Padding( padding: const EdgeInsets.only(bottom: 8.0), child: Container( height: 16, decoration: BoxDecoration( color: colorScheme.surface, borderRadius: BorderRadius.circular(4), ), ), ), ), ), ), ), Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( height: 24, width: 80, decoration: BoxDecoration( color: colorScheme.surface, borderRadius: BorderRadius.circular(4), ), ), const SizedBox(height: 16), SizedBox( height: 160, child: ListView.builder( scrollDirection: Axis.horizontal, itemCount: 6, itemBuilder: (context, index) => Padding( padding: const EdgeInsets.only(right: 12), child: Column( children: [ Container( width: 80, height: 80, decoration: BoxDecoration( color: colorScheme.surface, shape: BoxShape.circle, ), ), const SizedBox(height: 8), Container( width: 80, height: 16, decoration: BoxDecoration( color: colorScheme.surface, borderRadius: BorderRadius.circular(4), ), ), const SizedBox(height: 4), Container( width: 60, height: 14, decoration: BoxDecoration( color: colorScheme.surface, borderRadius: BorderRadius.circular(4), ), ), ], ), ), ), ), ], ), ), const SizedBox(height: 16), Shimmer.fromColors( baseColor: colorScheme.surfaceContainerHighest, highlightColor: colorScheme.surface, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( height: 24, width: 100, decoration: BoxDecoration( color: colorScheme.surface, borderRadius: BorderRadius.circular(4), ), ), const SizedBox(height: 12), SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row( children: List.generate( 5, (index) => Container( width: 100, height: 40, margin: const EdgeInsets.only(right: 8), decoration: BoxDecoration( color: colorScheme.surface, borderRadius: BorderRadius.circular(20), ), ), ), ), ), ], ), ), ), const SizedBox(height: 16), Shimmer.fromColors( baseColor: colorScheme.surfaceContainerHighest, highlightColor: colorScheme.surface, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: List.generate( 4, (index) => Padding( padding: const EdgeInsets.only(bottom: 8), child: Container( height: 70, decoration: BoxDecoration( color: colorScheme.surface, borderRadius: BorderRadius.circular(8), ), ), ), ), ), ), ), const SizedBox(height: 16), Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( height: 24, width: 100, decoration: BoxDecoration( color: colorScheme.surface, borderRadius: BorderRadius.circular(4), ), ), const SizedBox(height: 16), GridView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, childAspectRatio: 16 / 9, crossAxisSpacing: 8, mainAxisSpacing: 8, ), itemCount: 4, itemBuilder: (context, index) => Container( decoration: BoxDecoration( color: colorScheme.surface, borderRadius: BorderRadius.circular(8), ), ), ), ], ), ), const SizedBox(height: 32), ], ), ), ], ); } }