Flutter Hinge Animation (original) (raw)

Last Updated : 23 Jul, 2025

Animations are a big part of the Flutter application. It makes an app sweet to the eyes and equally user-friendly. In this article, we will discuss in detail the Hinge animations. In Flutter there are two ways to work with animations namely:

In this article, we will be working with the Animated Builder widget. A Hinge animation is a type of animation where an element can turn over with a sudden movement.

Steps to Implement Hinge Animation

Step 1 : Return Material App in main.dart() file

First, create **MyApp() in StatelessWidget and in it return **MaterialApp(). Now in MaterialApp() give the title of the app and add **debugShowCheckModeBanner as false which will remove the debug banner in the app.

**main.dart:

Dart `

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: HingeAnimation(), ); } }

`

Step 2 : Create a new Stateful class called HingeAnimation

Create a stateful widget class with title as ****"GeeksForGeeks", backgroundColor, foregroundColo**r, and many more in appbar.

**main.dart:

Dart `

// Create a stateful widget class HingeAnimation extends StatefulWidget { @override _HingeAnimationState createState() => _HingeAnimationState(); }

class _HingeAnimationState extends State{

// The animation widget @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Colors.green[300], foregroundColor: Colors.white, automaticallyImplyLeading: false, title: Text("GeeksForGeeks"), centerTitle: true, ), body: //code .. ); } }

`

Step 3 : Initialize Animation controller and Animation values

Define each animation controller & animation values using and initialize them in initState(), because the framework will call this method exactly once for each state object it creates.

Dart `

// Animation setup late AnimationController _controller; late Animation _rotationAnimation; late Animation _slideAnimation; late Animation _opacityAnimation;

@override void initState() { super.initState(); // Initialize the AnimationController _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 2000), );

// Setup the rotation animation
_rotationAnimation = Tween<double>(begin: 0.0, end: 0.15).animate(
  CurvedAnimation(
    parent: _controller,
    curve: Interval(
      0.0,
      0.5,
      curve: Curves.bounceInOut,
    ),
  ),
);

// Setup the slide animation
_slideAnimation = Tween<double>(begin: 100.0, end: 600.0).animate(
  CurvedAnimation(
    parent: _controller,
    curve: Interval(
      0.5,
      1.0,
      curve: Curves.fastOutSlowIn,
    ),
  ),
);

// Setup the opacity animation
_opacityAnimation = Tween<double>(begin: 1.0, end: 0.0).animate(
  CurvedAnimation(
    parent: _controller,
    curve: Interval(
      0.5,
      1.0,
      curve: Curves.fastOutSlowIn,
    ),
  ),
);

}

@override void dispose() { // Dispose the controller when the widget is disposed _controller.dispose(); super.dispose(); }

`

Step 4 : Use those in Scaffold body

using **AnimatedBuilder widget, we can apply those animations in scaffold body because it creates an animated builder.

Dart `

AnimatedBuilder( animation: _slideAnimation, builder: (BuildContext context, Widget? child) => Container( width: 200, height: 150, padding: EdgeInsets.all(0), margin: EdgeInsets.only( left: 100, top: _slideAnimation.value, ), child: RotationTransition( turns: _rotationAnimation, child: Center( child: Text( 'GeeksForGeeks', style: TextStyle( fontSize: 25, fontWeight: FontWeight.bold, color: Color.fromRGBO( 300, 150, 500, _opacityAnimation.value, ), ), ), ), ), ), ),

`

Step 5 : Add a **FloatingActionButton in HingeAnimation class

Add a **FloatingActionButton to play the animation and a text to implement the animations inside the HingeAnimation class.

Dart `

// The button to trigger the animation floatingActionButtonLocation: FloatingActionButtonLocation.miniCenterFloat, floatingActionButton: FloatingActionButton( child: Icon(Icons.play_arrow), backgroundColor: Colors.green[300], onPressed: () { _controller.forward(); }, ),

`

To know more about FloatingActionButton in flutter refer this article: Flutter – FloatingActionButton

Complete Source Code

**main.dart:

Dart `

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: HingeAnimation(), ); } }

// Create a stateful widget class HingeAnimation extends StatefulWidget { @override _HingeAnimationState createState() => _HingeAnimationState(); }

class _HingeAnimationState extends State with SingleTickerProviderStateMixin { // Animation setup late AnimationController _controller; late Animation _rotationAnimation; late Animation _slideAnimation; late Animation _opacityAnimation;

@override void initState() { super.initState(); // Initialize the AnimationController _controller = AnimationController( vsync: this, duration: Duration(milliseconds: 2000), );

// Setup the rotation animation
_rotationAnimation = Tween<double>(begin: 0.0, end: 0.15).animate(
  CurvedAnimation(
    parent: _controller,
    curve: Interval(
      0.0,
      0.5,
      curve: Curves.bounceInOut,
    ),
  ),
);

// Setup the slide animation
_slideAnimation = Tween<double>(begin: 100.0, end: 600.0).animate(
  CurvedAnimation(
    parent: _controller,
    curve: Interval(
      0.5,
      1.0,
      curve: Curves.fastOutSlowIn,
    ),
  ),
);

// Setup the opacity animation
_opacityAnimation = Tween<double>(begin: 1.0, end: 0.0).animate(
  CurvedAnimation(
    parent: _controller,
    curve: Interval(
      0.5,
      1.0,
      curve: Curves.fastOutSlowIn,
    ),
  ),
);

}

@override void dispose() {

// Dispose the controller when the widget is disposed
_controller.dispose();
super.dispose();

}

// The animation widget @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Colors.green[300], foregroundColor: Colors.white, automaticallyImplyLeading: false, title: Text("GeeksForGeeks"), centerTitle: true, ), body: AnimatedBuilder( animation: _slideAnimation, builder: (BuildContext context, Widget? child) => Container( width: 200, height: 150, padding: EdgeInsets.all(0), margin: EdgeInsets.only( left: 100, top: _slideAnimation.value, ), child: RotationTransition( turns: _rotationAnimation, child: Center( child: Text( 'GeeksForGeeks', style: TextStyle( fontSize: 25, fontWeight: FontWeight.bold, color: Color.fromRGBO( 300, 150, 500, _opacityAnimation.value, ), ), ), ), ), ), ),

  // The button to trigger the animation
  floatingActionButtonLocation:FloatingActionButtonLocation.miniCenterFloat,
  floatingActionButton: FloatingActionButton(
        child: Icon(Icons.play_arrow),
        backgroundColor: Colors.green[300],
        onPressed: () {
          _controller.forward();
        },
  ),
);

} }

`

**Output: