千家信息网

Flutter中怎么使用AnimatedSwitcher实现场景切换动画

发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,这篇文章主要介绍"Flutter中怎么使用AnimatedSwitcher实现场景切换动画"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Flutter中怎么使
千家信息网最后更新 2025年11月15日Flutter中怎么使用AnimatedSwitcher实现场景切换动画

这篇文章主要介绍"Flutter中怎么使用AnimatedSwitcher实现场景切换动画"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Flutter中怎么使用AnimatedSwitcher实现场景切换动画"文章能帮助大家解决问题。

AnimatedSwitcher 介绍

AnimatedSwitcher 通过动效完成其子组件的切换,默认的效果是 FadeTransition。当其子组件发生改变的时候,就会按设定的转变效果进行转换。AnimatedSwitcher的构造方法如下:

const AnimatedSwitcher({  Key? key,  this.child,  required this.duration,  this.reverseDuration,  this.switchInCurve = Curves.linear,  this.switchOutCurve = Curves.linear,  this.transitionBuilder = AnimatedSwitcher.defaultTransitionBuilder,  this.layoutBuilder = AnimatedSwitcher.defaultLayoutBuilder,})

与之前其他的动画组件不同,AnimatedSwitcher的参数除了 duration 之外,其他的有所不同,具体如下:

  • reverseDuration:反向时长,也就是切换为旧组件的时长,不设置的话就和 duration 一致。

  • switchInCurve:切入动画曲线,也就是新组件切换进入的曲线;

  • switchOutCurve:切出动画曲线,也就是旧组件切换出去时的曲线;

  • transitionBuilder:切换转变动画构建,是一个函数,定义如下,可以用这个方法来构建自己的切换动效。

typedef AnimatedSwitcherTransitionBuilder = Widget Function(Widget child, Animation animation);
  • layoutBuilder:可以设置新组件在组件树中的布局,也是一个函数:

typedef AnimatedSwitcherLayoutBuilder = Widget Function(Widget? currentChild, List previousChildren);

默认布局为 defaultLayoutBuilder,也就是将当前组件放置在最顶层:

static Widget defaultLayoutBuilder(Widget? currentChild, List previousChildren) {  return Stack(    children: [      ...previousChildren,      if (currentChild != null) currentChild,    ],    alignment: Alignment.center,  );}

关于AnimatedSwitcher有一个地方需要特别注意,那就是如果切换的两个组件相同的话,AnimatedSwitcher会以为组件没有改变,而不会进行动效切换。文档说明如下:

The child is considered to be "new" if it has a different type or [Key]

实际上是根据 WidgetcanUpdate 判断的:

static int _debugConcreteSubtype(Widget widget) {  return widget is StatefulWidget ? 1 :         widget is StatelessWidget ? 2 :         0;}

因此,如果两个组件类型相同,需要使用不同的 Key 来区分,通常是使用 ValueKey

应用

下面我们来实现开篇的动效,这个使用的是 SizeTransition 尺寸变化转变动效完成两张图片的切换,这样会让组件的尺寸从小变到大,有一种掀开面纱的感觉。代码如下:

class AnimatedSwitcherDemo extends StatefulWidget {  AnimatedSwitcherDemo({Key? key}) : super(key: key);  @override  _AnimatedSwitcherDemoState createState() => _AnimatedSwitcherDemoState();}class _AnimatedSwitcherDemoState extends State {  Widget? _animatedWidget;  bool test = false;  @override  void initState() {    super.initState();    _animatedWidget = ClipOval(      child: Image.asset('images/beauty.jpeg'),      key: ValueKey(1),    );  }  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: Text('AnimatedSwticher'),        brightness: Brightness.dark,        backgroundColor: Colors.black,      ),      backgroundColor: Colors.black,      body: Center(        child: Container(          padding: EdgeInsets.all(10.0),          child: AnimatedSwitcher(            child: _animatedWidget,            duration: const Duration(milliseconds: 1000),            transitionBuilder: (child, animation) {              return SizeTransition(                sizeFactor: animation,                child: child,              );            },          ),        ),      ),      floatingActionButton: FloatingActionButton(        child: Icon(Icons.play_arrow),        onPressed: () {          setState(() {            test = !test;            _animatedWidget = test                ? ClipOval(                    child: Image.asset('images/beauty2.jpeg'),                    key: ValueKey(2),                  )                : ClipOval(                    child: Image.asset('images/beauty.jpeg'),                    key: ValueKey(1),                  );          });        },      ),    );  }}

关于"Flutter中怎么使用AnimatedSwitcher实现场景切换动画"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

组件 切换 动画 不同 也就是 曲线 场景 方法 知识 相同 两个 函数 实际 尺寸 布局 效果 时长 行业 实用 一致 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 不同格式存放数据库 上海服务器电源价格是多少 实时转码服务器 人工智能网络技术有限公司 共建网络安全手抄报少字很少 软件开发注释量30% 普陀区参考数据库服务商成本 为什么zao显示服务器繁忙 网络安全战略研讨 上市网络安全工程师待遇 不属于数据库管理数据 华臻网络安全 网络安全手抄报 八年级内容 服务器系统运维方案价格 封开网络安全宣传周 湖南自考网络安全本科 陌陌争霸怎么进不去服务器 网络安全事件分类分为几级 计算机网络安全pdf刘远生 随着网络技术不断深入人心英语 服务器更新需要几天 用友t3如何更新数据库 网络安全事故管理者职责 深圳点距智慧网络技术有限公司 数据库技术与应用软件安装 鄞州专业软件开发设计 数据库 推荐 书籍 网络安全等级保护系统测评 计算机在哪里打开录音服务器 山东省大学生网络技术比赛内容
0