Flutter 在主题中改变页面过渡速度/持续时间

Posted

技术标签:

【中文标题】Flutter 在主题中改变页面过渡速度/持续时间【英文标题】:Flutter change page transition speed/duration in the theme 【发布时间】:2020-02-11 05:12:15 【问题描述】:

如何更改应用主题中设置的过渡持续时间/速度?

我可以使用MaterialApp 的主题更改过渡动画。下面的示例将默认转换替换为FadeTransition。使用淡入淡出过渡时感觉很慢,我无法弄清楚如何更改主题中设置的过渡持续时间。

import 'package:flutter/material.dart';

void main() 
  runApp(MyApp());


final themeData = ThemeData(
  pageTransitionsTheme: PageTransitionsTheme(builders: 
    TargetPlatform.ios: FadeTransitionBuilder(),
    TargetPlatform.android: FadeTransitionBuilder(),
  ),
);

class FadeTransitionBuilder extends PageTransitionsBuilder 
  @override
  Widget buildTransitions<T>(_, __, animation, ___, child) => FadeTransition(opacity: animation, child: child);


class MyApp extends StatefulWidget 
  @override
  _MyAppState createState() => _MyAppState();


class _MyAppState extends State<MyApp> with WidgetsBindingObserver 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: 'Mobile',
      theme: themeData,
      initialRoute: '/',
      routes: routes,
    );
  

【问题讨论】:

在颤振源代码中这看起来是硬编码为 300 毫秒???:github.com/flutter/flutter/blob/dev/packages/flutter/lib/src/… 【参考方案1】:

我可以使用命名路由来实现这一点,您需要在提供给 MaterialApp 构建器的您自己的 Navigator 实例中列出这些路由。 MaterialApp 的 initialRoute 属性必须被移除。

class _MyAppState extends State<MyApp> with WidgetsBindingObserver 

  Route<dynamic> generateRoute(RouteSettings settings) 
    switch (settings.name) 
      case '/about':
        return CustomPageRoute(
            builder: (context) => About());
      default:
        return CustomPageRoute(
            builder: (context) => Home());
    
  

  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: 'Mobile',
      theme: themeData,
      builder: (context, widget) 
        return Navigator(
          onGenerateRoute: generateRoute,
        );
      ,
    );
  


class CustomPageRoute extends MaterialPageRoute 
  @override
  Duration get transitionDuration => const Duration(milliseconds: 1000);

  CustomPageRoute(builder) : super(builder: builder);

【讨论】:

【参考方案2】:

创建这个类:

class MyRoute extends MaterialPageRoute 
  MyRoute(WidgetBuilder builder) : super(builder: builder);

  @override
  Duration get transitionDuration => Duration(seconds: 3);

现在,而不是使用常规

Navigator.push(context, MaterialPageRoute(builder: (_) => Page2()));

使用

Navigator.push(context, MyRoute(builder: (_) => Page2()));

【讨论】:

非常相似的解决方案(扩展 MaterialPageRoute 类),但更简洁,代码更少。对我来说效果很好 - 谢谢!

以上是关于Flutter 在主题中改变页面过渡速度/持续时间的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Navigator 2.0 页面过渡

Flutter中如何改变按钮主题的文字颜色

在 Flutter 添加页面过渡动画

React-Spring - 改变过渡动画速度

无法为此侧边菜单设置过渡速度[重复]

使用 GetX 改变主题?