Flutter:如何将PageRoute动画与Navigator.ofcontext.pushNamed结合

问题描述

我想在我的Flutter项目中使用动画页面路由。现在我所有的路线都命名为路线,我不想更改它们。有什么办法可以将“页面路由动画”与命名路由一起使用?就像:如果我要使用PageOne()PageTwo()Navigator.of(context).pushNamed(PageTwo.routename),我不想看到认的过渡,可能是我想使用比例动画或淡入淡出动画。有什么办法吗?

onTap: () {
  Navigator.of(context).pushNamed(
     ProductsSearch.routeName,arguments: ScreenArguments(null,null,true,false),);
},

解决方法

由于您的问题我已经解决了该演示答案,请尝试一下,然后再试一次。

 import 'package:flutter/material.dart';

 void main() {
 runApp(
 MaterialApp(
  home: HomePage(),onGenerateRoute: (RouteSettings settings) {
    final SecondHome args = settings.arguments;
    switch (settings.name) {
      case '/':
        return SlideRightRoute(widget:HomePage());
        break;
      case '/second':
      return 
    SlideRightRoute(widget:SecondHome(args.data1,args.data2,args.boolvalue));
       break;
      }
    },),);
}



class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
  appBar: AppBar(
    title: Text('Home'),body: new Center(
    child: RaisedButton(
      onPressed: () {
       Navigator.of(context).pushNamed(
          '/second',arguments:SecondHome("data1","data2",true),);
      },child: Text('Second Home'),);
 }
}



class SecondHome extends StatelessWidget {
String data1;
String data2;
bool boolvalue;
SecondHome(this.data1,this.data2,this.boolvalue);
@override
Widget build(BuildContext context) {
 print("Secoendhomedata${data1}");
  return Scaffold(
  appBar: AppBar(
    title: Text('Second Home'),body: new Center(
    child: RaisedButton(
      onPressed: () {
        Navigator.pop(context);
      },child: Text('Go Back'),);
   }
 }

class SlideRightRoute extends PageRouteBuilder {
final Widget widget;
SlideRightRoute({this.widget})
  : super(
pageBuilder: (BuildContext context,Animation<double> animation,Animation<double> secondaryAnimation) {
  return widget;
},transitionsBuilder: (BuildContext context,Animation<double> secondaryAnimation,Widget child) {
  return new SlideTransition(
    position: new Tween<Offset>(
      begin: const Offset(1.0,0.0),end: Offset.zero,).animate(animation),child: child,);
   },);
}