image

31 Jan 2026

9K

35K

Flutter Animated Slide Transition for Page Navigation

In modern mobile application development, a smooth and intuitive user experience is paramount. Animations play a crucial role in achieving this, providing visual feedback and guiding users through the application flow. Flutter, with its rich set of animation widgets and powerful rendering engine, makes it easy to implement sophisticated UI animations, including custom page transitions.

This article focuses on creating a visually appealing slide transition for page navigation in Flutter, leveraging the SlideTransition widget and custom PageRouteBuilder to enhance your app's navigation experience.

Why Slide Transitions for Page Navigation?

Slide transitions offer several benefits for page navigation:

  • Visual Continuity: They maintain context by showing the new page sliding in from a particular direction, often pushing out the old page.
  • Enhanced User Experience: Smooth transitions feel natural and make the app more engaging and delightful to use.
  • Clarity of Flow: The direction of the slide can subtly indicate the relationship between pages (e.g., sliding from right to left for pushing a new page, and left to right for popping back).
  • Modern Aesthetic: Custom animations differentiate your app and contribute to a polished, professional look and feel.

Implementing a Custom Slide Transition

Flutter's Navigator.push method typically uses MaterialPageRoute (or CupertinoPageRoute for iOS-style apps), which provides platform-specific transitions. To implement a custom slide transition, we need to use a PageRouteBuilder.

A PageRouteBuilder allows you to define custom animation transitions for entering and exiting routes. It takes two primary callbacks:

  • pageBuilder: This builds the content of the new page.
  • transitionsBuilder: This defines how the new page transitions onto the screen.

Step 1: Create Your Pages

First, let's create two simple pages: a HomePage and a SecondPage. The HomePage will have a button to navigate to the SecondPage.

HomePage.dart:


import 'package:flutter/material.dart';
import 'second_page.dart';
import 'slide_page_route.dart';

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Page'),
      ),
      body: Center(
        child: ElevatedButton(
          child: Text('Go to Second Page'),
          onPressed: () {
            Navigator.of(context).push(
              SlidePageRoute(page: SecondPage()),
            );
          },
        ),
      ),
    );
  }
}

SecondPage.dart:


import 'package:flutter/material.dart';

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Welcome to the Second Page!'),
            SizedBox(height: 20),
            ElevatedButton(
              child: Text('Go Back'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        ),
      ),
    );
  }
}

Step 2: Define Your Custom SlidePageRoute

Now, we'll create a custom SlidePageRoute class that extends PageRouteBuilder. This class will encapsulate our slide transition logic.

slide_page_route.dart:


import 'package:flutter/material.dart';

class SlidePageRoute extends PageRouteBuilder {
  final Widget page;

  SlidePageRoute({required this.page})
      : super(
          pageBuilder: (
            BuildContext context,
            Animation<double> animation,
            Animation<double> secondaryAnimation,
          ) =>
              page,
          transitionsBuilder: (
            BuildContext context,
            Animation<double> animation,
            Animation<double> secondaryAnimation,
            Widget child,
          ) {
            // Define the start and end offset for the slide transition.
            // Offset(1.0, 0.0) means it starts from the right edge of the screen.
            var begin = Offset(1.0, 0.0);
            var end = Offset.zero; // Offset.zero means the widget is at its normal position.

            // Define the animation curve for a smooth transition.
            var curve = Curves.ease;

            // Create a Tween for the offset animation.
            var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));

            // Use a SlideTransition widget to apply the animation.
            return SlideTransition(
              position: animation.drive(tween),
              child: child,
            );
          },
          // Optional: Define the transition duration. Default is 300ms.
          transitionDuration: Duration(milliseconds: 400),
          // Optional: Define the reverse transition duration.
          reverseTransitionDuration: Duration(milliseconds: 400),
        );
}

Explanation of transitionsBuilder:

  • animation: This is the primary animation for the incoming route (from 0.0 to 1.0).
  • secondaryAnimation: This is the secondary animation for the outgoing route (from 0.0 to 1.0, but often inverted or offset for different effects).
  • child: This is the widget returned by the pageBuilder (our SecondPage).

Inside transitionsBuilder:

  1. We define begin and end Offset values. Offset(1.0, 0.0) represents a position that is one screen width to the right, and Offset.zero is the normal position. This configuration makes the new page slide in from the right.
  2. A Curve (e.g., Curves.ease) is chosen for the animation's timing.
  3. A Tween<Offset> is created, chained with a CurveTween to apply the easing.
  4. Finally, a SlideTransition widget is returned. Its position property is driven by our animation via animation.drive(tween), applying the slide effect to the child (the new page).

Step 3: Integrate with Your Main Application

Update your main.dart to use the HomePage.

main.dart:


import 'package:flutter/material.dart';
import 'home_page.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Slide Transition Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: HomePage(),
    );
  }
}

Customization and Enhancements

You can easily customize the slide transition:

  • Direction:
    • From top: begin = Offset(0.0, -1.0)
    • From bottom: begin = Offset(0.0, 1.0)
    • From left: begin = Offset(-1.0, 0.0)
  • Curves: Experiment with different Curves for various easing effects (e.g., Curves.fastOutSlowIn, Curves.bounceOut, Curves.decelerate).
  • Duration: Adjust transitionDuration to make the animation faster or slower.
  • Simultaneous Outgoing Page Animation: You can also animate the outgoing page using secondaryAnimation in conjunction with another SlideTransition or FadeTransition.

For example, to slide in from the bottom with a faster animation:


// Inside SlidePageRoute's constructor:
// ...
          transitionsBuilder: (context, animation, secondaryAnimation, child) {
            var begin = Offset(0.0, 1.0); // Starts from bottom
            var end = Offset.zero;
            var curve = Curves.fastOutSlowIn; // A different curve

            var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));

            return SlideTransition(
              position: animation.drive(tween),
              child: child,
            );
          },
          transitionDuration: Duration(milliseconds: 300), // Faster
// ...

Conclusion

Implementing custom animated slide transitions for page navigation in Flutter is straightforward with PageRouteBuilder and SlideTransition. By abstracting this logic into a reusable SlidePageRoute class, you can easily apply consistent, delightful animations throughout your application, significantly improving its user experience and making it stand out. Experiment with different directions, curves, and durations to find the perfect animation style for your app.

Related Articles

May 14, 2026

Building a Multi-Event Countdown Timer Widget with Reminders, Notifications, Repeat, and Custom Labels in Flutter

Building a Multi-Event Countdown Timer Widget with Reminders, Notifications, Repeat, and Custom Labels in Flutter Countdown timers are essential in many applic

May 11, 2026

Unleashing Dynamic UIs: Flutter's Animation Prowess

Unleashing Dynamic UIs: Flutter's Animation Prowess for Slide & Scale Effects Flutter's declarative UI framework, combined with its powerful animation capabilit

May 11, 2026

Building a Product Detail Page Widget in Flutter with Related Items, Review Carousel, Promo Badges, and Quick Buy

Building a Product Detail Page Widget in Flutter with Related Items, Review Carousel, Promo Badges, and Quick Buy A well-designed Product Detail Page (PDP) is