如何删除默认导航路线动画

Posted

技术标签:

【中文标题】如何删除默认导航路线动画【英文标题】:How to remove default navigation route animation 【发布时间】:2020-01-06 10:38:21 【问题描述】:

我在颤振文档中给出的页面路由代码下方

// Within the `FirstRoute` widget
onPressed: () 
  Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => SecondRoute()),
  );

但它在推送和弹出路由时提供了一些动画。

对于android,页面的入口过渡滑动页面 向上并淡入。退出过渡是相同的,但在 反向。

过渡适应平台,在 ios 上,页面滑动 从右侧进入并反向退出。页面也切换到 当另一个页面进入以覆盖它时,它会留在视差中。 (这些 方向在从右到左阅读的环境中翻转 方向。)

有没有办法在没有任何动画的情况下路由到下一页?

编辑: 请检查整个代码:

class MyApp extends StatelessWidget 
  final routes = <String, WidgetBuilder>
    SecondRoute.tag: (context) => SecondRoute(),
  ;

  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: "Flutter Routes",
      home: new FirstRoute(),
      routes: routes,
      onGenerateRoute: (routeSettings) 
        if (routeSettings.name == SecondRoute.tag)
          return PageRouteBuilder(pageBuilder: (_, a1, a2) => SecondRoute());

        return null;
      ,
    );
  


class FirstRoute extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: Text('First Route'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Open route'),
          onPressed: () 
            Navigator.of(context).pushNamed(SecondRoute.tag);

          ,
        ),
      ),
    );
  


class SecondRoute extends StatelessWidget 
  static String tag = 'second-route';

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Route"),
      ),
      body: Center(
        child: RaisedButton(
          onPressed: () 
            Navigator.pop(context);
          ,
          child: Text('Go back!'),
        ),
      ),
    );
  

【问题讨论】:

【参考方案1】:

对于@​​987654321@

Navigator.push(
  context,
  PageRouteBuilder(pageBuilder: (_, __, ___) => SecondRoute()),
)

对于@​​987654323@

首先,将此添加到您的MaterialApp

MaterialApp(
  onGenerateRoute: (settings) 
    if (settings.name == '/second') 
      return PageRouteBuilder(pageBuilder: (_, __, ___) => SecondRoute());

    return null;
  ,
)

现在,您可以使用:

Navigator.pushNamed(context, '/second');

【讨论】:

这里的 routeSettings 是什么? routeSettings 是需要传递给onGenerateRoute 的参数,你能告诉我解决方案是否有效吗? 我在 Android 上检查过,它不起作用,它为 pushNamed 提供了相同的动画。 它现在对我有用,会接受你的回答。但可以详细说明为什么不需要路由属性以及为什么会导致问题? @CopsOnRoad: 另外(_, a1, a2) 是什么意思?正如在 Rémi Rousselet 的回答中,我看到 _, __, ___【参考方案2】:

由于 Flutter 现在正在迁移到 Navigator 2.0 以获得更多支持,我建议您查看他们的 migration guide,了解如何将 TransitionDelegate 添加到 Navigator。将此类的实例添加到您的导航器以实现预期结果:

import 'package:flutter/widgets.dart';

class NoAnimationTransitionDelegate extends TransitionDelegate<void> 
  @override
  Iterable<RouteTransitionRecord> resolve(
    List<RouteTransitionRecord> newPageRouteHistory,
    Map<RouteTransitionRecord, RouteTransitionRecord> locationToExitingPageRoute,
    Map<RouteTransitionRecord, List<RouteTransitionRecord>> pageRouteToPagelessRoutes,
  ) 
    final List<RouteTransitionRecord> results = <RouteTransitionRecord>[];

    for (final RouteTransitionRecord pageRoute in newPageRouteHistory) 
      // Renames isEntering to isWaitingForEnteringDecision.
      if (pageRoute.isWaitingForEnteringDecision) 
        pageRoute.markForAdd();
      
      results.add(pageRoute);

    
    for (final RouteTransitionRecord exitingPageRoute in locationToExitingPageRoute.values) 
      // Checks the isWaitingForExitingDecision before calling the markFor methods.
      if (exitingPageRoute.isWaitingForExitingDecision) 
        exitingPageRoute.markForRemove();
        final List<RouteTransitionRecord> pagelessRoutes = pageRouteToPagelessRoutes[exitingPageRoute];
        if (pagelessRoutes != null) 
          for (final RouteTransitionRecord pagelessRoute in pagelessRoutes) 
            pagelessRoute.markForRemove();
          
        
      
      results.add(exitingPageRoute);

    
    return results;
   
 

【讨论】:

【参考方案3】:

用这个替换你的MyApp

class MyApp extends StatelessWidget 
  final routes = <String, WidgetBuilder>SecondRoute.tag: (context) => SecondRoute();

  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: "Flutter Routes",
      home: new FirstRoute(),
      onGenerateRoute: (routeSettings) 
        if (routeSettings.name == SecondRoute.tag)
          return PageRouteBuilder(
            pageBuilder: (_, a1, a2) => FadeTransition(opacity: a1 ,child: SecondRoute()),
            transitionDuration: Duration(seconds: 5),
          );

        return null;
      ,
    );
  

【讨论】:

【参考方案4】:

动画由MaterialPageRoute执行。如果您不想要它,只需使用其他东西:

Navigator.push(
  context,
  PageRouteBuilder(pageBuilder: (_, __, ___) => MyRoute()),
)

【讨论】:

另外,我发现 Navigator.of(context).pushNamed(SecondRoute.tag);也做同样的动画,我们怎么能避免呢? @jitsm555 这也是在内部使用MaterialPageRoute 完成的。 @CopsOnRoad:我们如何从那里删除动画? @jitsm555 你可以在MaterialApp onGenerateRoute 做到这一点。 @jitsm555 看看我的回答。

以上是关于如何删除默认导航路线动画的主要内容,如果未能解决你的问题,请参考以下文章

React&Material UI-如何根据路线删除导航按钮/链接?

如何在android中删除底部导航视图的图标动画

如何在动态渲染底部导航视图时删除动画?

如何在导航栏动画期间删除不需要的黑色区域。屏幕截图

有人知道如何从导航栏中删除不需要的动画吗?截图

如何在颤动中删除特定路线?