voo_motion 0.0.2 copy "voo_motion: ^0.0.2" to clipboard
voo_motion: ^0.0.2 copied to clipboard

Simple and powerful animation package with extension methods for Flutter widgets

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:voo_motion/voo_motion.dart';
import 'package:voo_ui_core/voo_ui_core.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return VooDesignSystem(
      data: VooDesignSystemData.defaultSystem,
      child: VooResponsiveBuilder(
        builder: (context, screenInfo) => MaterialApp(
          title: 'VooMotion Demo',
          theme: ThemeData(
            colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
            useMaterial3: true,
          ),
          home: const VooMotionDemo(),
        ),
      ),
    );
  }
}

class VooMotionDemo extends StatefulWidget {
  const VooMotionDemo({super.key});

  @override
  State<VooMotionDemo> createState() => _VooMotionDemoState();
}

class _VooMotionDemoState extends State<VooMotionDemo> {
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        title: const Text('VooMotion Examples').fadeIn(),
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
      ),
      body: ListView(
        padding: const EdgeInsets.all(16),
        children: [
          _buildSection('Drop In Animation', [
            ElevatedButton(
              onPressed: () {},
              child: const Text('Drop In Button'),
            ).dropIn(delay: const Duration(milliseconds: 200)),
            const SizedBox(height: 16),
            Card(
              child: const Padding(
                padding: EdgeInsets.all(16),
                child: Text('This card drops in with a bounce'),
              ),
            ).dropIn(
              delay: const Duration(milliseconds: 400),
              fromHeight: 100,
            ),
          ]),
          _buildSection('Fade Animations', [
            Container(
              padding: const EdgeInsets.all(16),
              decoration: BoxDecoration(
                color: Colors.blue.shade100,
                borderRadius: BorderRadius.circular(8),
              ),
              child: const Text('Fade In Text'),
            ).fadeIn(delay: const Duration(milliseconds: 600)),
            const SizedBox(height: 16),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                const Icon(Icons.star, size: 40, color: Colors.amber)
                    .fadeIn(delay: const Duration(milliseconds: 800)),
                const Icon(Icons.favorite, size: 40, color: Colors.red)
                    .fadeIn(delay: const Duration(milliseconds: 1000)),
                const Icon(Icons.thumb_up, size: 40, color: Colors.green)
                    .fadeIn(delay: const Duration(milliseconds: 1200)),
              ],
            ),
          ]),
          _buildSection('Slide Animations', [
            Container(
              padding: const EdgeInsets.all(16),
              color: Colors.green.shade100,
              child: const Text('Slide from Left'),
            ).slideInLeft(delay: const Duration(milliseconds: 1400)),
            const SizedBox(height: 8),
            Container(
              padding: const EdgeInsets.all(16),
              color: Colors.orange.shade100,
              child: const Text('Slide from Right', textAlign: TextAlign.right),
            ).slideInRight(delay: const Duration(milliseconds: 1600)),
            const SizedBox(height: 8),
            Container(
              padding: const EdgeInsets.all(16),
              color: Colors.purple.shade100,
              child: const Text('Slide from Top', textAlign: TextAlign.center),
            ).slideInTop(delay: const Duration(milliseconds: 1800)),
            const SizedBox(height: 8),
            Container(
              padding: const EdgeInsets.all(16),
              color: Colors.red.shade100,
              child:
                  const Text('Slide from Bottom', textAlign: TextAlign.center),
            ).slideInBottom(delay: const Duration(milliseconds: 2000)),
          ]),
          _buildSection('Scale Animations', [
            Container(
              width: 100,
              height: 100,
              decoration: BoxDecoration(
                color: Colors.blue,
                shape: BoxShape.circle,
              ),
              child: const Icon(Icons.add, color: Colors.white, size: 40),
            ).scaleIn(
              delay: const Duration(milliseconds: 2200),
              curve: Curves.elasticOut,
            ),
            const SizedBox(height: 16),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                _buildColorBox(Colors.red).scaleIn(
                  delay: const Duration(milliseconds: 2400),
                  from: 0.5,
                ),
                _buildColorBox(Colors.green).scaleIn(
                  delay: const Duration(milliseconds: 2600),
                  from: 0.5,
                ),
                _buildColorBox(Colors.blue).scaleIn(
                  delay: const Duration(milliseconds: 2800),
                  from: 0.5,
                ),
              ],
            ),
          ]),
          _buildSection('Rotation Animation', [
            const Icon(
              Icons.refresh,
              size: 60,
              color: Colors.blue,
            ).rotate(
              delay: const Duration(milliseconds: 3000),
              duration: const Duration(seconds: 2),
              repeat: true,
            ),
          ]),
          _buildSection('Bounce Animation', [
            Container(
              padding: const EdgeInsets.all(16),
              decoration: BoxDecoration(
                color: Colors.orange,
                borderRadius: BorderRadius.circular(8),
              ),
              child: const Text(
                'Bouncing Widget',
                style: TextStyle(color: Colors.white),
              ),
            ).bounce(
              delay: const Duration(milliseconds: 3200),
              repeat: true,
            ),
          ]),
          _buildSection('Shake Animation', [
            ElevatedButton(
              onPressed: () {},
              style: ElevatedButton.styleFrom(
                backgroundColor: Colors.red,
              ),
              child: const Text('Shake Me!'),
            ).shake(
              delay: const Duration(milliseconds: 3400),
              intensity: 5,
            ),
          ]),
          _buildSection('Flip Animation', [
            Card(
              color: Colors.purple,
              child: const Padding(
                padding: EdgeInsets.all(32),
                child: Text(
                  'Flip X',
                  style: TextStyle(color: Colors.white, fontSize: 20),
                ),
              ),
            ).flipX(delay: const Duration(milliseconds: 3600)),
            const SizedBox(height: 16),
            Card(
              color: Colors.teal,
              child: const Padding(
                padding: EdgeInsets.all(32),
                child: Text(
                  'Flip Y',
                  style: TextStyle(color: Colors.white, fontSize: 20),
                ),
              ),
            ).flipY(delay: const Duration(milliseconds: 3800)),
          ]),
          _buildSection('Stagger List', [
            VooStaggerList(
              animationType: StaggerAnimationType.slideLeft,
              staggerDelay: const Duration(milliseconds: 100),
              config: const VooAnimationConfig(
                delay: Duration(milliseconds: 4000),
              ),
              children: List.generate(5, (index) {
                return Container(
                  margin: const EdgeInsets.only(bottom: 8),
                  padding: const EdgeInsets.all(16),
                  decoration: BoxDecoration(
                    color: Colors
                        .primaries[index % Colors.primaries.length].shade100,
                    borderRadius: BorderRadius.circular(8),
                  ),
                  child: Text('Staggered Item ${index + 1}'),
                );
              }),
            ),
          ]),
          _buildSection('Chained Animations', [
            Container(
              padding: const EdgeInsets.all(16),
              decoration: BoxDecoration(
                gradient: LinearGradient(
                  colors: [Colors.blue, Colors.purple],
                ),
                borderRadius: BorderRadius.circular(8),
              ),
              child: const Text(
                'Multiple Animations',
                style: TextStyle(color: Colors.white),
              ),
            )
                .fadeIn(
                  delay: const Duration(milliseconds: 5000),
                )
                .scaleIn(
                  delay: const Duration(milliseconds: 5500),
                ),
          ]),
          const SizedBox(height: 100),
        ],
      ),
    );
  }

  Widget _buildSection(String title, List<Widget> children) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: [
        Padding(
          padding: const EdgeInsets.symmetric(vertical: 16),
          child: Text(
            title,
            style: Theme.of(context).textTheme.headlineSmall,
          ).slideInLeft(),
        ),
        ...children,
        const SizedBox(height: 32),
      ],
    );
  }

  Widget _buildColorBox(Color color) {
    return Container(
      width: 60,
      height: 60,
      decoration: BoxDecoration(
        color: color,
        borderRadius: BorderRadius.circular(8),
      ),
    );
  }
}
2
likes
160
points
235
downloads

Publisher

verified publishervoostack.com

Weekly Downloads

Simple and powerful animation package with extension methods for Flutter widgets

Homepage
Repository (GitHub)

Documentation

API reference

License

MIT (license)

Dependencies

flutter, vector_math, voo_ui_core

More

Packages that depend on voo_motion