Sobes.tech
Middle

Como escolher a forma adequada de implementar animações numa aplicação Flutter?

sobes.tech IA

Resposta da IA

A escolha depende da complexidade da animação, da sua frequência e do grau de interação com o utilizador.

Principais métodos:

  • ImplicitlyAnimatedWidgets: Animações simples de transição de estado para alterar propriedades de widgets (tamanho, cor, transparência). Anima automaticamente as alterações de propriedades.

    // Exemplo de AnimatedContainer
    AnimatedContainer(
      duration: const Duration(seconds: 1),
      width: _size,
      height: _size,
      color: _color,
      alignment: Alignment.center,
      curve: Curves.fastOutSlowIn,
      child: const FlutterLogo(size: 75),
    );
    
  • AnimatedBuilder e AnimationController: Para animações mais complexas e personalizadas. Requer controlo explícito através de AnimationController e redesenho do widget com AnimatedBuilder.

    // Exemplo de RotationTransition com AnimationController
    class RotatingSquare extends StatefulWidget {
      @override
      _RotatingSquareState createState() => _RotatingSquareState();
    }
    
    class _RotatingSquareState extends State<RotatingSquare> with SingleTickerProviderStateMixin {
      late AnimationController _controller;
      late Animation<double> _animation;
    
      @override
      void initState() {
        super.initState();
        _controller = AnimationController(
          duration: const Duration(seconds: 2),
          vsync: this,
        )..repeat(); // Repetir animação
    
        _animation = CurvedAnimation(
          parent: _controller,
          curve: Curves.linear, // Curva linear da animação
        );
      }
    
      @override
      void dispose() {
        _controller.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return RotationTransition( // Widget para rotação
          turns: _animation,
          child: Container(
            width: 100,
            height: 100,
            color: Colors.blue,
          ),
        );
      }
    }
    
  • AnimatedWidget: Classe abstrata para criar widgets animados reutilizáveis. Facilita a criação de widgets que dependem de AnimationController.

    // Exemplo de ScaleTransition (herda de AnimatedWidget)
    ScaleTransition(
      scale: _animation,
      child: const FlutterLogo(size: 75),
    );
    
  • Hero animations: Animações de transição entre telas, quando o mesmo widget "voa" de uma tela para outra.

    // Na primeira tela
    Hero(tag: 'logo', child: FlutterLogo(size: 50));
    
    // Na segunda tela
    Hero(tag: 'logo', child: FlutterLogo(size: 200));
    
  • CustomPaint: Para desenhar gráficos personalizados e sua animação. Requer um profundo entendimento de desenho no canvas.

Tabela comparativa:

Método Complexidade Controle sobre a animação Uso
ImplicitlyAnimatedWidgets Baixa Limitado Mudanças simples de propriedades
AnimatedBuilder/Controller Média Completo Animações complexas/personalizadas
AnimatedWidget Média Completo Widgets animados reutilizáveis
Hero animations Baixa Limitado Transições entre telas
CustomPaint Alta Completo Gráficos personalizados

Escolha o método mais simples que satisfaça os requisitos de animação. Para casos simples, prefira ImplicitlyAnimatedWidgets. Para cenários mais complexos e personalizados, use AnimatedBuilder com AnimationController. Hero para transições, CustomPaint para gráficos complexos.