Flutter页面路由过渡动画插件route_transitions的使用

发布于 1周前 作者 nodeper 来自 Flutter

Flutter页面路由过渡动画插件route_transitions的使用

Route transitions

Route transitions 插件支持最新的Dart空安全特性。该包已被重写,以使用友好的路由函数进行导航,即使您最喜欢路由转换,也可以使用 transitionBuilder 构建自定义动画!

示例

如何使用

要使用此插件,首先需要导入 route_transitions 包:

import 'package:route_transitions/route_transitions.dart';

然后可以像下面这样使用预定义的路由转换方法来实现页面跳转,并带有动画效果:

ElevatedButton(
  onPressed: () => pushWidget(
    newPage: Dashboard(),
    context: context,
  ),
  child: Text("Push page"),
),

以上代码实现了点击按钮后,从当前页面跳转到 Dashboard 页面,并且默认带有从下到上的滑动动画。

友好的API

该插件提供了非常友好的API,可以通过以下链接查看更详细的例子:example/lib/main.dart

友好API

自定义动画与customAnimationWidget

如果您想要创建自定义动画,可以使用 customAnimationWidget 方法。例如,下面是一个缩放动画的例子:

customAnimationWidget(
  newPage: YourPage(),
  context: context,
  transitionBuilder: (context, animation, secondaryAnimation, child) {
    var begin = 0.0;
    var end = 1.0;
    var curve = Curves.easeIn;

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

    return ScaleTransition(
      scale: animation.drive(tween),
      child: child,
    );
  },
)

这段代码将为您的页面添加一个渐进式的缩放动画效果。

完整的示例Demo

接下来提供一个完整的示例demo,它展示了如何在Flutter应用中集成和使用route_transitions插件的不同类型的路由过渡动画。

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

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

const TextStyle style = TextStyle(fontSize: 22, color: Colors.white);

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Route transitions',
      theme: ThemeData.dark(),
      home: Home(),
      debugShowCheckedModeBanner: false,
    );
  }
}

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Route transitions"),
        centerTitle: true,
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () => pushWidget(
                newPage: Dashboard(),
                context: context,
              ),
              child: Text("Push page"),
            ),
            ElevatedButton(
              onPressed: () => fadeWidget(
                newPage: Dashboard(),
                context: context,
              ),
              child: Text("Fade in"),
            ),
            ElevatedButton(
              onPressed: () => slideRightWidget(
                newPage: Dashboard(),
                context: context,
              ),
              child: Text("Slide from right"),
            ),
            ElevatedButton(
              onPressed: () => slideLeftWidget(
                newPage: Dashboard(),
                context: context,
              ),
              child: Text("Slide from left"),
            ),
            ElevatedButton(
              onPressed: () => slideUpWidget(
                newPage: Dashboard(),
                context: context,
              ),
              child: Text("Slide from up"),
            ),
            ElevatedButton(
              onPressed: () => slideDownWidget(
                newPage: Dashboard(),
                context: context,
              ),
              child: Text("Slide from down"),
            ),
            ElevatedButton(
              onPressed: () => scaleWidget(
                newPage: Dashboard(),
                context: context,
              ),
              child: Text("Scale page"),
            ),
            ElevatedButton(
              onPressed: () => customAnimationWidget(
                newPage: Dashboard(),
                context: context,
                transitionBuilder: (context, animation, secondaryAnimation, child) {
                  var begin = 0.0;
                  var end = 1.0;
                  var curve = Curves.easeIn;

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

                  return ScaleTransition(
                    scale: animation.drive(tween),
                    child: child,
                  );
                },
              ),
              child: Text("Custom animation"),
            ),
          ],
        ),
      ),
    );
  }
}

class Dashboard extends StatelessWidget {
  const Dashboard({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Dashboard"),
        centerTitle: true,
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () => pop(context),
          child: Text("Go back !"),
        ),
      ),
    );
  }
}

这个完整的demo包含了多种不同的页面切换动画效果,您可以直接复制并在自己的项目中运行,体验各种动画效果。


更多关于Flutter页面路由过渡动画插件route_transitions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter页面路由过渡动画插件route_transitions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用route_transitions插件来实现页面路由过渡动画的示例代码。

首先,确保你的pubspec.yaml文件中已经添加了route_transitions依赖:

dependencies:
  flutter:
    sdk: flutter
  route_transitions: ^2.0.0  # 请使用最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以按照以下步骤设置路由和过渡动画。

1. 定义路由配置

在你的主文件中(通常是main.dart),配置路由并使用RouteTransitionsBuilder来包裹你的MaterialApp或CupertinoApp。

import 'package:flutter/material.dart';
import 'package:route_transitions/route_transitions.dart';
import 'package:flutter/cupertino.dart'; // 如果你使用Cupertino风格

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return RouteTransitionsBuilder<dynamic>(
      routes: {
        '/': (context) => HomeScreen(),
        '/second': (context) => SecondScreen(),
      },
      builder: (context, animation, secondaryAnimation, child) {
        return MaterialApp(
          title: 'Route Transitions Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: child,
        );
      },
    );
  }
}

2. 创建屏幕页面

创建两个简单的屏幕页面,HomeScreenSecondScreen

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Screen'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.of(context).pushNamed('/second', arguments: 'Hello from Home!');
          },
          child: Text('Go to Second Screen'),
        ),
      ),
    );
  }
}

class SecondScreen extends StatelessWidget {
  final String message;

  SecondScreen({Key? key, required this.message}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Screen'),
      ),
      body: Center(
        child: Text('Message: $message'),
      ),
    );
  }
}

3. 配置过渡动画

RouteTransitionsBuilder中,你可以通过transitionsBuilder属性来定义不同的过渡动画。以下是一个简单的例子,使用默认的slideInTransitionslideOutTransition

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return RouteTransitionsBuilder<dynamic>(
      routes: {
        '/': (context) => HomeScreen(),
        '/second': (context) => SecondScreen(message: ModalRoute.of(context)!.settings.arguments as String),
      },
      transitionsBuilder: (context, animation, secondaryAnimation, child, route) {
        // 使用内置的 slideInTransition 和 slideOutTransition
        if (route.isInitialRoute) {
          return FadeTransition(
            opacity: animation,
            child: child,
          ); // 首页可以使用不同的过渡动画,比如淡入
        } else {
          return SlideTransition(
            position: Tween<Offset>(
              begin: Offset.zero,
              end: const Offset(1.0, 0),
            ).animate(animation),
            child: SlideTransition(
              position: Tween<Offset>(
                begin: const Offset(-1.0, 0),
                end: Offset.zero,
              ).animate(secondaryAnimation),
              child: child,
            ),
          ); // 其他页面使用滑动过渡动画
        }
      },
      builder: (context, animation, secondaryAnimation, child) {
        return MaterialApp(
          title: 'Route Transitions Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: child,
        );
      },
    );
  }
}

在上面的代码中,首页使用了淡入动画,而其他页面则使用了从右到左的滑动动画。你可以根据需要调整动画效果,route_transitions插件提供了多种内置动画,你也可以自定义动画效果。

希望这个示例代码能帮助你在Flutter项目中实现页面路由过渡动画。

回到顶部