Flutter页面过渡动画插件go_router_page_transition的使用

Flutter页面过渡动画插件go_router_page_transition的使用

在Flutter开发中,页面过渡动画可以让应用更加生动和流畅。go_router_page_transition 是一个强大的插件,可以轻松实现各种页面过渡效果。本文将详细介绍如何使用 go_router_page_transition 插件来为您的Flutter应用添加页面过渡动画。

使用步骤

1. 添加依赖

首先,在项目的 pubspec.yaml 文件中添加 go_routergo_router_page_transition 的依赖项。确保版本号与最新稳定版本一致。

dependencies:
  go_router: ^9.0.3
  go_router_page_transition: ^1.0.0

然后运行以下命令以安装依赖:

flutter pub get

2. 配置路由

在项目中配置路由时,使用 GoRouterPageTransition 来定义页面之间的过渡动画。

示例代码

以下是一个完整的示例,展示如何使用 go_router_page_transition 实现页面过渡动画。

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:go_router_page_transition/go_router_page_transition.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerConfig: _router,
    );
  }

  // 配置路由
  final GoRouter _router = GoRouter(
    routes: [
      // 主页路由
      GoRoute(
        path: '/',
        builder: (context, state) => HomePage(),
      ),
      // 第二页路由
      GoRoute(
        path: '/second',
        builder: (context, state) => SecondPage(),
        pageBuilder: (context, state) => MaterialPage<void>(
          child: FadeTransitionPage(
            child: SecondPage(),
          ),
        ),
      ),
    ],
  );
}

// 主页
class HomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('主页')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 跳转到第二页,并指定过渡动画
            context.go('/second', extra: {'transitionType': 'fade'});
          },
          child: Text('跳转到第二页'),
        ),
      ),
    );
  }
}

// 第二页
class SecondPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('第二页')),
      body: Center(
        child: Text('这是第二页'),
      ),
    );
  }
}

3. 自定义过渡动画

在上面的示例中,我们使用了 FadeTransitionPage 来实现淡入淡出的过渡效果。go_router_page_transition 提供了多种内置的过渡动画类型,例如滑动、缩放等。您可以根据需求选择合适的动画。

常见的过渡动画类型

  • FadeTransitionPage:淡入淡出效果。
  • ScaleTransitionPage:缩放效果。
  • SlideTransitionPage:滑动效果。
  • CustomTransitionPage:自定义过渡效果。

例如,如果要使用滑动效果,可以将 FadeTransitionPage 替换为 SlideTransitionPage

pageBuilder: (context, state) => MaterialPage<void>(
  child: SlideTransitionPage(
    child: SecondPage(),
  ),
),

4. 动态切换动画类型

如果您希望在不同场景下动态切换动画类型,可以通过传递参数来控制动画效果。例如,在 HomePage 中传递动画类型:

onPressed: () {
  // 动态传递动画类型
  context.go('/second', extra: {'transitionType': 'scale'});
},

然后在 SecondPage 中根据参数动态设置动画类型:

[@override](/user/override)
Widget build(BuildContext context) {
  final transitionType = ModalRoute.of(context)?.settings.extra;

  return Scaffold(
    appBar: AppBar(title: Text('第二页')),
    body: Center(
      child: Text('这是第二页'),
    ),
    // 根据参数动态设置动画类型
    pageTransitionsTheme: PageTransitionsTheme(
      builders: {
        TargetPlatform.android: ScaleTransitionPage(),
        TargetPlatform.iOS: FadeTransitionPage(),
      },
    ),
  );
}

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

1 回复

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


go_router_page_transition 是一个用于 Flutter 的插件,它结合了 go_router 和页面过渡动画的功能,使得在页面导航时能够轻松地添加自定义的过渡动画。go_router 是一个声明式的路由库,而 go_router_page_transition 则在此基础上提供了动画支持。

以下是如何使用 go_router_page_transition 插件的步骤:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 go_routergo_router_page_transition 依赖:

dependencies:
  flutter:
    sdk: flutter
  go_router: ^6.0.0
  go_router_page_transition: ^0.1.0

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

2. 创建路由配置

接下来,你需要创建一个 GoRouter 实例,并在其中定义你的路由。使用 GoRouterPageTransition 来包装你的页面,并指定过渡动画。

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:go_router_page_transition/go_router_page_transition.dart';

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

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

  final GoRouter _router = GoRouter(
    routes: [
      GoRoute(
        path: '/',
        pageBuilder: (context, state) => const GoRouterPageTransition(
          child: HomePage(),
          transitionType: TransitionType.fade,
        ),
      ),
      GoRoute(
        path: '/details',
        pageBuilder: (context, state) => const GoRouterPageTransition(
          child: DetailsPage(),
          transitionType: TransitionType.slide,
        ),
      ),
    ],
  );

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerConfig: _router,
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Home')),
      body: Center(
        child: ElevatedButton(
          onPressed: () => context.go('/details'),
          child: const Text('Go to Details'),
        ),
      ),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Details')),
      body: Center(
        child: ElevatedButton(
          onPressed: () => context.go('/'),
          child: const Text('Go back to Home'),
        ),
      ),
    );
  }
}

3. 使用过渡动画

GoRouterPageTransition 中,你可以通过 transitionType 参数指定不同的过渡动画类型。go_router_page_transition 提供了以下几种内置的过渡动画类型:

  • TransitionType.fade: 淡入淡出效果
  • TransitionType.slide: 滑动效果
  • TransitionType.scale: 缩放效果
  • TransitionType.rotate: 旋转效果
  • TransitionType.custom: 自定义过渡动画

4. 自定义过渡动画

如果你想使用自定义的过渡动画,可以使用 TransitionType.custom,并通过 transitionBuilder 参数来定义你的动画:

GoRoute(
  path: '/custom',
  pageBuilder: (context, state) => GoRouterPageTransition(
    child: CustomPage(),
    transitionType: TransitionType.custom,
    transitionBuilder: (context, animation, secondaryAnimation, child) {
      return SlideTransition(
        position: Tween<Offset>(
          begin: const Offset(1.0, 0.0),
          end: Offset.zero,
        ).animate(CurvedAnimation(
          parent: animation,
          curve: Curves.easeInOut,
        )),
        child: child,
      );
    },
  ),
),
回到顶部