✨ shimmer_ai – Effortless Flutter Shimmer
Instantly Create Skeleton Screens & Animated Loading Effects with .withShimmerAi()
shimmer_ai is a lightweight, zero-configuration Flutter package that instantly adds beautiful, smooth shimmer loading effects and skeleton screens to any widget — including Text, Images, Buttons, Cards, ListTiles, and more — with just one line of code! ✨
Perfect for creating engaging skeleton UIs, dynamic content placeholders, and polished preload states that enhance UI/UX, delight users, and make your app feel incredibly responsive and professional.
🚀 Key Features & Benefits
- ⚡️ Universal Application: Apply shimmer animations on any Flutter widget – no need to build custom placeholder widgets.
- 🧠 Minimal API: Just add
.withShimmerAi(loading: true)
to any widget. - 🎨 Extensive Customization: Colors, duration, direction, tilt, border radius, loop, custom gradient.
- 🎯 Pixel‑Perfect Layout (v1.3.0+): Control width, height, margin, padding, decoration without wrappers.
- ⚙️ No External Dependencies
- ✅ High Performance
- 📱 Responsive & Adaptive
- 💡 Perfect for: Loading states, skeleton UIs, onboarding animations, list/grid loaders.
🎉 Getting Started
dependencies:
shimmer_ai: ^1.3.0
flutter pub get
import 'package:shimmer_ai/shimmer_ai.dart';
💡 Simple Usage
Text('Loading Data').withShimmerAi(loading: true);
Card( child: Column(children: []), ).withShimmerAi(loading: true);
🔧 Advanced Usage & Customization
Direct Parameters
Text('Loading...')
.withShimmerAi(
loading: true,
baseColor: Colors.grey.shade300,
highlightColor: Colors.grey.shade100,
borderRadius: 16,
duration: Duration(seconds: 2),
direction: ShimmerDirection.rtl,
angle: 0.5,
repeat: false,
loopCount: 3,
);
Using ShimmerAiConfig
const myCustomShimmerConfig = ShimmerAiConfig(
baseColor: Colors.deepPurple,
highlightColor: Colors.purpleAccent,
duration: Duration(milliseconds: 2500),
direction: ShimmerDirection.btt,
angle: -0.7,
borderRadius: 8,
);
CircleAvatar(radius: 50).withShimmerAi( loading: true, config: myCustomShimmerConfig, );
Custom Gradient
Container(
width: 280,
height: 60,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.blueGrey,
borderRadius: BorderRadius.circular(10),
),
child: const Text('Animated Placeholder'),
).withShimmerAi(
loading: true,
customGradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Colors.cyan.shade100,
Colors.teal.shade50,
Colors.cyan.shade100,
],
stops: [0.0, 0.5, 1.0],
),
duration: Duration(seconds: 3),
angle: 0.8,
);
Pixel‑Perfect Layout (v1.3.0+)
Text(' ')
.withShimmerAi(
loading: true,
width: 160,
height: 16,
margin: const EdgeInsets.only(bottom: 8),
padding: const EdgeInsets.symmetric(horizontal: 8),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(6)),
);
📸 Examples
Text Placeholder
Text(' ').withShimmerAi(
loading: loading,
width: 220,
height: 12,
margin: const EdgeInsets.only(bottom: 16),
padding: const EdgeInsets.symmetric(horizontal: 8),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(6)),
);
Image Placeholder
Image.network('https://picsum.photos/seed/ai/600/400', fit: BoxFit.cover)
.withShimmerAi(
loading: loading,
width: 280,
height: 160,
margin: const EdgeInsets.symmetric(vertical: 8),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(12)),
);
Circular Avatar
SizedBox.shrink().withShimmerAi(
loading: loading,
width: 64,
height: 64,
decoration: BoxDecoration(shape: BoxShape.circle),
);
Button
ElevatedButton(onPressed: () {}, child: const Text('Continue'))
.withShimmerAi(
loading: loading,
width: 200,
height: 48,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(10)),
);
Card Placeholder
Card(
child: SizedBox(
height: 120,
child: Center(
child: Text(loading ? ' ' : 'Loaded Card Content'),
),
),
).withShimmerAi(
loading: loading,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(12)),
);
ListTile
ListTile(
leading: const CircleAvatar(radius: 24),
title: Text(loading ? ' ' : 'Title'),
subtitle: Text(loading ? ' ' : 'Subtitle'),
).withShimmerAi(
loading: loading,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(12)),
);
Icon
Icon(Icons.star, size: 28).withShimmerAi(
loading: loading,
width: 44,
height: 44,
decoration: BoxDecoration(shape: BoxShape.circle),
);
Grid
GridView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: 6,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisSpacing: 8,
crossAxisSpacing: 8,
),
itemBuilder: (_, i) {
return SizedBox.shrink().withShimmerAi(
loading: loading,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(12)),
);
},
);
🤝 Contributing
We welcome PRs, bug reports, and suggestions! Open an issue or PR on GitHub.
📄 License
MIT © karanpadaliya