You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中AnimatedSwitcher实现组件间自动循环动画问题求助

问题修复说明

你的代码存在3处可直接定位的错误,修复后即可实现Text和Image自动循环切换的动画效果:

  • 定时器未绑定实例:initState中创建的周期定时器没有赋值给预先声明的timer变量,页面销毁时无法正常取消定时器,会触发内存泄漏
  • 索引更新逻辑错误:你使用了后置自增index++,赋值时会先返回index的原始值再执行自增,实际上索引不会发生变化,需要修改为index + 1或者前置自增++index
  • 销毁方法递归调用:dispose回调中直接调用了dispose(),会触发无限递归导致栈溢出,需要修改为调用父类方法super.dispose()

修复后完整代码

import 'dart:async';
import 'package:flutter/material.dart';

class SimpleTry extends StatefulWidget {
  const SimpleTry({Key? key}) : super(key: key);

  @override
  _SimpleTryState createState() => _SimpleTryState();
}

class _SimpleTryState extends State<SimpleTry> {
  int index = 0;

  final widgets = const [
    FirstWidget(),
    SecondWidget(),
  ];

  Timer? timer;

  @override
  void initState() {
    super.initState();
    // 把定时器实例赋值给timer变量
    timer = Timer.periodic(const Duration(seconds: 1), (Timer t) {
      final isLastIndex = index == widgets.length - 1;
      // 修复索引更新逻辑
      setState(() => index = isLastIndex ? 0 : index + 1);
    });
  }

  @override
  void dispose() {
    timer?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            AnimatedSwitcher(
              duration: const Duration(seconds: 1),
              child: widgets[index],
            ),
          ],
        ),
      ),
    );
  }
}

class SecondWidget extends StatelessWidget {
  const SecondWidget({
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Image.asset(
      'images/u trap.png',
      width: 150,
      height: 150,
      key: const Key('1'),
    );
  }
}

class FirstWidget extends StatelessWidget {
  const FirstWidget({
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const Text(
      'Hi',
      key: Key('2'),
    );
  }
}

内容的提问来源于stack exchange,提问作者SameJall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:57:03