Flutter路由动画插件proste_route_animation的使用

Flutter路由动画插件proste_route_animation的使用

proste_route_animation 是一个用于Flutter应用中的路由动画插件。它提供了多种动画效果,包括淡入淡出、滑动、缩放和旋转等。下面将详细介绍如何使用这个插件。

介绍

通过使用Flutter的过渡小部件来实现页面间的动画切换。以下是插件提供的主要功能:

  • 支持多种动画方式:淡入淡出、从左/右/上/下滑动、缩放、旋转等。
  • 可以设置进入和退出的时间。
  • 支持自定义曲线(Curves)。

示例动画

使用方法

直接使用 Navigator.push

你可以直接使用 Navigator.push 方法来推送带有动画的路由:

Navigator.push(
  context, 
  ProsteRouteAnimation.fadeRoute(route: DemoPage(), duration: Duration(milliseconds: 300))
);

使用 Navigator.pushNamed

你也可以通过 onGenerateRouteMaterialApp 中设置路由,并使用 Navigator.pushNamed 来导航到指定页面:

MaterialApp(
  onGenerateRoute: (settings) {
    Widget widget;
    switch(settings.name) {
      case '/demo':
        widget = DemoPage();
        break;
      default:
        return null;
    }
    
    return ProsteRouteAnimation.fadeRoute(route: widget, duration: Duration(milliseconds: 300));
  },
);

// 导航按钮
RaisedButton(
  onPressed: () {
    Navigator.pushNamed(
      context,
      '/demo',
      arguments: {'param': 'some value'},
    );
  },
  child: Text('Push'),
);

动画模式

ProsteSlideMode

用于确定 ProsteRouteAnimation.slideRoute() 的动画路径:

  • fromLeft: 页面从左向右滑动
  • fromRight: 页面从右向左滑动
  • fromBottom: 页面从下向上滑动
  • fromTop: 页面从上向下滑动

示例代码:

ProsteRouteAnimation.slideRoute(
  route: DemoPage(),
  mode: ProsteSlideMode.fromLeft,
  duration: Duration(milliseconds: 300),
);

ProsteAnimationMode

用于确定构造函数所使用的动画方法:

  • fade: 淡入淡出动画
  • slideFromLeft: 左滑动画
  • slideFromRight: 右滑动画
  • slideFromBottom: 上滑动画
  • slideFromTop: 下滑动画
  • scale: 缩放动画
  • rotation: 旋转动画
  • size: 大小变化动画

示例代码:

ProsteRouteAnimation(
  builder: (context) => DemoPage(),
  mode: ProsteAnimationMode.fade,
  duration: Duration(milliseconds: 300),
);

API

请注意,使用构造函数方法无法控制路由时间,其他静态函数可以控制进入和退出时间。

示例Demo

下面是一个完整的示例Demo,展示了如何使用 proste_route_animation 插件的不同动画效果。

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:proste_route_animation/proste_route_animation.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      onGenerateRoute: (settings) {
        final Map arg = Map.from(settings.arguments as Map);
        var route = DemoPage(param: arg['param']);
        switch (arg['type']) {
          case 'ProsteRouteAnimation':
            return ProsteRouteAnimation(
              builder: (context) => route,
              curve: arg['curve'],
              useFade: arg['useFade'],
              axis: arg['axis'],
              alignment: arg['aligment'],
              mode: arg['animationMode'],
            );
          case 'fadeRoute':
            return ProsteRouteAnimation.fadeRoute(
              route: route,
              duration: Duration(milliseconds: arg['duration']),
              reverseDuration: Duration(milliseconds: arg['reverseDuration']),
              curve: arg['curve'],
            );
          // 其他case...
        }
      },
      home: Scaffold(
        appBar: AppBar(title: Text('proste_route_animation')),
        body: MyAppHome(),
      ),
    );
  }
}

class MyAppHome extends StatefulWidget {
  [@override](/user/override)
  _MyAppHomeState createState() => _MyAppHomeState();
}

class _MyAppHomeState extends State<MyAppHome> {
  String _returnMessage = '';
  ProsteSlideMode _slideMode = ProsteSlideMode.fromLeft;
  Alignment _alignment = Alignment.center;
  bool _useFade = false;
  Axis _axis = Axis.vertical;
  int _duration = 300;
  int _reverseDuration = 300;
  Curve _curve = Curves.linear;
  ProsteAnimationMode _animationMode = ProsteAnimationMode.fade;

  String _getRandom() => Random().nextDouble().toString();

  Widget _paddingWidget({required Widget child}) {
    return Padding(padding: EdgeInsets.only(top: 15), child: child);
  }

  // 省略了部分UI组件代码...

  Widget _jumpButton(String title) {
    return RaisedButton(
      onPressed: () {
        String param = _getRandom();
        Navigator.pushNamed(
          context,
          '/demo',
          arguments: {
            'param': param,
            'type': title,
            'slideMode': _slideMode,
            'aligment': _alignment,
            'useFade': _useFade,
            'axis': _axis,
            'duration': _duration,
            'reverseDuration': _reverseDuration,
            'curve': _curve,
            'animationMode': _animationMode,
          },
        ).then((value) {
          setState(() {
            _returnMessage = value.toString();
          });
        });
      },
      child: Text(title),
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ListView(
      children: [
        _paddingWidget(child: Text('returnMessage: $_returnMessage', textAlign: TextAlign.center)),
        // 省略了部分UI组件代码...
        Wrap(
          alignment: WrapAlignment.spaceEvenly,
          children: [
            _jumpButton('fadeRoute'),
            _jumpButton('slideRoute'),
            _jumpButton('scaleRoute'),
            _jumpButton('rotationRoute'),
            _jumpButton('sizeRoute'),
            _jumpButton('ProsteRouteAnimation'),
          ],
        ),
      ],
    );
  }
}

class DemoPage extends StatelessWidget {
  final String param;

  const DemoPage({required this.param});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('demo')),
      body: Column(
        children: [
          Text('param is $param'),
          RaisedButton(
            onPressed: () {
              Random random = Random();
              Navigator.pop<int>(context, random.nextInt(100));
            },
            child: Text('Back'),
          )
        ],
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用proste_route_animation插件来实现路由动画的一个基本示例。这个插件可以帮助你在Flutter应用中实现自定义的页面跳转动画。

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

dependencies:
  flutter:
    sdk: flutter
  proste_route_animation: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,你可以按照以下步骤配置和使用这个插件:

  1. 定义动画配置

    你可以通过创建一个自定义的RouteAnimation类来定义你的动画配置。这个类将包含动画的类型、持续时间和曲线等参数。

    import 'package:proste_route_animation/proste_route_animation.dart';
    
    class CustomRouteAnimation extends RouteAnimation {
      @override
      Widget buildTransition(
        BuildContext context,
        Animation<double> animation,
        Animation<double> secondaryAnimation,
        Widget child,
      ) {
        return SlideTransition(
          position: Tween<Offset>(
            begin: Offset(1.0, 0.0), // 开始位置(右侧)
            end: Offset(0.0, 0.0),   // 结束位置(中间)
          ).animate(animation),
          child: child,
        );
      }
    
      @override
      Duration getTransitionDuration(Route route) => Duration(milliseconds: 500);
    }
    
  2. 配置MaterialApp的路由

    你需要将Navigator包装在一个ProsteRouter中,并配置自定义的路由动画。

    import 'package:flutter/material.dart';
    import 'package:proste_route_animation/proste_route_animation.dart';
    import '你的页面文件.dart'; // 替换为你的页面文件路径
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          navigatorObservers: [ProsteRouteObserver()],
          onGenerateRoute: (RouteSettings settings) {
            switch (settings.name) {
              case '/':
                return ProsteRoute(
                  builder: (_) => HomePage(),
                  animation: CustomRouteAnimation(),
                );
              case '/second':
                return ProsteRoute(
                  builder: (_) => SecondPage(),
                  animation: CustomRouteAnimation(),
                );
              default:
                return MaterialPageRoute(builder: (_) => Scaffold(body: Center(child: Text('Page not found'))));
            }
          },
          initialRoute: '/',
        );
      }
    }
    
  3. 创建页面

    创建你的HomePageSecondPage,并确保它们有基本的UI结构。

    // HomePage.dart
    import 'package:flutter/material.dart';
    
    class HomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Home Page'),
          ),
          body: Center(
            child: ElevatedButton(
              onPressed: () {
                Navigator.pushNamed(context, '/second');
              },
              child: Text('Go to Second Page'),
            ),
          ),
        );
      }
    }
    
    // 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: Text('This is the second page!'),
          ),
        );
      }
    }
    

这样,你就完成了一个基本的Flutter应用,它使用了proste_route_animation插件来实现自定义的路由动画。当你从HomePage跳转到SecondPage时,你应该能看到定义的滑动动画效果。

回到顶部