# flutter_svga
A **Flutter package** for parsing and rendering **SVGA animations** efficiently.
SVGA is a lightweight and powerful animation format used for **dynamic UI effects** in mobile applications.
---
## 🎯 **Why flutter_svga?**
### ✅ **Actively Maintained**
Unlike **`svgaplayer_flutter`** (archived since Feb 2023), `flutter_svga` is **actively maintained** with regular updates, bug fixes, and community support.
### ⚡ **High Performance**
- **Intelligent caching system** reduces network usage and load times
- **Binary format** smaller than JSON-based Lottie files
- **Optimized rendering** for smooth 60 FPS animations
### 🎨 **Feature-Rich**
- **Audio playback** integrated directly in animations
- **Dynamic elements** (replace text, images, colors at runtime)
- **Full platform support** (Android, iOS, Web, macOS, Linux, Windows)
### 📦 **Comparison**
| Feature | flutter_svga | svgaplayer_flutter | Lottie |
|---------|--------------|-------------------|--------|
| **Status** | ✅ **Active** | ❌ Archived (Feb 2023) | ✅ Active |
| **Caching** | ✅ Built-in intelligent cache | ❌ No | ⚠️ Manual |
| **Audio Support** | ✅ Integrated | ❌ No | ✅ Yes |
| **File Size** | 🟢 Small (binary) | 🟢 Small (binary) | 🟡 Larger (JSON) |
| **Dynamic Elements** | ✅ Text, Images, Drawers | ⚠️ Limited | ✅ Yes |
| **Platform Support** | ✅ All 6 platforms | ⚠️ Mobile only | ✅ All platforms |
| **Performance** | ⚡ Optimized | ⚡ Good | ⚡ Good |
---
## 🔄 **Migrating from svgaplayer_flutter**
Switching from the archived `svgaplayer_flutter` is simple:
### 1. Update Dependencies
```yaml
dependencies:
# svgaplayer_flutter: ^2.2.0 # Remove old package
flutter_svga: ^0.0.13 # Add new package
```
### 2. Update Imports
```dart
// Old
// import 'package:svgaplayer_flutter/svgaplayer_flutter.dart';
// New
import 'package:flutter_svga/flutter_svga.dart';
```
### 3. API Usage (mostly compatible)
The API is similar, with some enhancements:
```dart
// Both packages use similar controller patterns
SVGAAnimationController controller = SVGAAnimationController(vsync: this);
// Loading remains the same
final videoItem = await SVGAParser.shared.decodeFromAssets("assets/animation.svga");
controller.videoItem = videoItem;
controller.repeat();
```
**🎉 Bonus**: You now get **automatic caching**, **audio support**, and **better performance** with zero code changes!
---
## 🚀 **Features**
✔️ Parse and render **SVGA animations** in Flutter.
✔️ Load SVGA files from **assets** and **network URLs**.
✔️ **Intelligent caching system** for faster loading and reduced network usage.
✔️ Supports **custom dynamic elements** (text, images, animations).
✔️ **Optimized playback performance** with animation controllers.
✔️ **Integrated audio playback** within SVGA animations.
✔️ Works on **Android & iOS** (Web & Desktop support coming soon).
✔️ Easy **loop, stop, and seek** functions.
---
## 📌 **Installation**
Add **flutter_svga** to your `pubspec.yaml`:
```yaml
dependencies:
flutter_svga: ^0.0.13
```
Then, install dependencies:
```sh
flutter pub get
```
---
## 🎬 **Basic Usage**
### ✅ **Playing an SVGA Animation from Assets**
```dart
import 'package:flutter/material.dart';
import 'package:flutter_svga/flutter_svga.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text("Flutter SVGA Example")),
body: Center(
child: SVGAEasyPlayer(
assetsName: "assets/sample_with_audio.svga",
fit: BoxFit.contain,
),
),
),
);
}
}
```
---
## 🌍 **Playing SVGA from a Network URL**
```dart
SVGAEasyPlayer(
resUrl: "https://example.com/sample.svga",
fit: BoxFit.cover,
);
```
---
## 🎭 **Advanced Usage: Using SVGAAnimationController**
### ✅ **Controlling Animation Playback**
```dart
class MySVGAWidget extends StatefulWidget {
@override
_MySVGAWidgetState createState() => _MySVGAWidgetState();
}
class _MySVGAWidgetState extends State
with SingleTickerProviderStateMixin {
late SVGAAnimationController _controller;
@override
void initState() {
super.initState();
_controller = SVGAAnimationController(vsync: this);
SVGAParser.shared.decodeFromAssets("assets/sample.svga").then((video) {
_controller.videoItem = video;
_controller.repeat();
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return SVGAImage(_controller);
}
}
```
---
## 🎨 **Customization & Dynamic Elements**
### ✅ **Adding Dynamic Text**
```dart
controller.videoItem!.dynamicItem.setText(
TextPainter(
text: TextSpan(
text: "Hello SVGA!",
style: TextStyle(color: Colors.red, fontSize: 18),
),
textDirection: TextDirection.ltr,
),
"text_layer",
);
```
---
### ✅ **Replacing an Image Dynamically**
```dart
controller.videoItem!.dynamicItem.setImageWithUrl(
"https://example.com/new_image.png",
"image_layer",
);
```
---
### ✅ **Hiding a Layer**
```dart
controller.videoItem!.dynamicItem.setHidden(true, "layer_to_hide");
```
---
## 🗄️ **Caching (New!)**
**Automatic performance optimization with zero breaking changes:**
```dart
// Caching works automatically - no code changes needed!
final animation = await SVGAParser.shared.decodeFromURL(
"https://example.com/animation.svga"
);
// Optional: Configure cache settings
SVGACache.shared.setMaxCacheSize(50 * 1024 * 1024); // 50MB
SVGACache.shared.setMaxAge(const Duration(days: 3)); // 3 days
// Optional: Manage cache
await SVGACache.shared.clear(); // Clear all cache
final stats = await SVGACache.shared.getStats(); // Get cache info
```
**📋 See [CACHE.md](CACHE.md) for complete caching documentation and examples.**
---
## 🎯 **Playback Controls**
```dart
controller.forward(); // Play once
controller.repeat(); // Loop playback
controller.stop(); // Stop animation
controller.value = 0; // Reset to first frame
```
---
## 🔊 **Audio Volume Control**
```dart
// Set volume (0.0 to 1.0)
controller.volume = 0.5;
// Mute audio (preserves volume setting)
controller.muted = true;
// Unmute audio
controller.muted = false;
```
---
## 🛠 **Common Issues & Solutions**
### ❌ **Black Screen when Loading SVGA**
✅ **Solution:** Ensure your `svga` files are correctly placed inside `assets/` and registered in `pubspec.yaml`.
```yaml
flutter:
assets:
- assets/sample.svga
```
---
### ❌ **SVGA Not Loading from Network**
✅ **Solution:** Ensure the SVGA file is accessible via HTTPS. Test the URL in a browser.
```dart
SVGAEasyPlayer(
resUrl: "https://example.com/sample.svga",
fit: BoxFit.cover,
);
```
---
### ❌ **Animation Freezes or Doesn't Play**
✅ **Solution:** Use `setState` after loading SVGA to rebuild the widget.
```dart
setState(() {
_controller.videoItem = video;
});
```
---
## 📱 **Supported Platforms**
| Platform | Supported | Audio Support |
|----------|-----------|---------------|
| ✅ Android | ✔️ Yes | ✔️ Yes |
| ✅ iOS | ✔️ Yes | ✔️ Yes |
| ✅ Linux | ✔️ Yes | ✔️ Yes |
| ✅ Web | ✔️ Yes | ❌ No |
| ✅ macOS | ✔️ Yes | ✔️ Yes |
| ✅ Desktop | ✔️ Yes | ✔️ Yes |
---
## 🔄 **Changelog**
See the latest changes in [`CHANGELOG.md`](CHANGELOG.md).
---
## 📜 **License**
This package is licensed under the **MIT License**. See [`LICENSE`](LICENSE) for details.
---
## 🤝 **Contributing**
- If you find a **bug**, report it [here](https://github.com/5alafawyyy/flutter_svga/issues).
- Pull requests are welcome! See [`CONTRIBUTING.md`](CONTRIBUTING.md) for guidelines.
---
## 👨💻 **Authors & Contributors**
### 🏗 **Core Author**
- **[5alafawyyy](https://github.com/5alafawyyy)** — Lead Developer, Maintainer, and Flutter Integration Engineer.
### 🤝 **Contributors**
Special thanks to the amazing contributors who improved **flutter_svga**:
| Contributor | Contribution | GitHub |
|--------------|--------------|--------|
| **[wonderkidshihab](https://github.com/wonderkidshihab)** | Fixed repeated music playback bug (#3) | 🧩 |
| **[Sansuihe](https://github.com/Sansuihe)** | Identified and proposed MD5-based fix for audio cache collision (#6) | 🎵 |
| **[tungpham6195](https://github.com/tungpham6195)** | Reported protobuf dependency compatibility issue (#7) | 📦 |
> Want to contribute? Read [CONTRIBUTING.md](CONTRIBUTING.md) and submit your PR — we’d love your help!
---
🚀 **Enjoy using SVGA animations in your Flutter app!** 🚀