Flutter - 具有 3D 效果的页面之间的过渡

Cri*_*tos 3 dart flutter

如何在具有 3D/立方体效果的页面之间转换?我需要这样的过渡 在此处输入图片说明

Khe*_*rel 7

在此处输入图片说明

import 'dart:math';

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter 3D transition',
        theme: ThemeData(
          backgroundColor: Colors.white,
          primarySwatch: Colors.green,
        ),
        home: Page1());
  }
}

class Page1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.blue[50],
      body: Center(
        child: RaisedButton(
          onPressed: () => Navigator.of(context).pushReplacement(
            Pseudo3dRouteBuilder(this, Page2()),
          ),
          child: Text('change the page'),
        ),
      ),
    );
  }
}

class Page2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.pink[50],
      body: Center(
        child: RaisedButton(
          onPressed: () => Navigator.of(context).pushReplacement(
            Pseudo3dRouteBuilder(this, Page1()),
          ),
          child: Text('change the page'),
        ),
      ),
    );
  }
}

class Pseudo3dRouteBuilder extends PageRouteBuilder {
  final Widget enterPage;
  final Widget exitPage;
  Pseudo3dRouteBuilder(this.exitPage, this.enterPage)
      : super(
          pageBuilder: (context, animation, secondaryAnimation) => enterPage,
          transitionsBuilder: _transitionsBuilder(exitPage, enterPage),
        );

  static _transitionsBuilder(exitPage, enterPage) =>
      (context, animation, secondaryAnimation, child) {
        return Stack(
          children: <Widget>[
            SlideTransition(
              position: Tween<Offset>(
                begin: Offset.zero,
                end: Offset(-1.0, 0.0),
              ).animate(animation),
              child: Container(
                color: Colors.white,
                child: Transform(
                  transform: Matrix4.identity()
                    ..setEntry(3, 2, 0.003)
                    ..rotateY(pi / 2 * animation.value),
                  alignment: FractionalOffset.centerRight,
                  child: exitPage,
                ),
              ),
            ),
            SlideTransition(
              position: Tween<Offset>(
                begin: Offset(1.0, 0.0),
                end: Offset.zero,
              ).animate(animation),
              child: Container(
                color: Colors.white,
                child: Transform(
                  transform: Matrix4.identity()
                    ..setEntry(3, 2, 0.003)
                    ..rotateY(pi / 2 * (animation.value - 1)),
                  alignment: FractionalOffset.centerLeft,
                  child: enterPage,
                ),
              ),
            )
          ],
        );
      };
}
Run Code Online (Sandbox Code Playgroud)