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

如何在Dart中循环遍历列表元素实现简单动画?

实现Dart字符循环动画的两种实用方法

嘿,这个需求超实用!用-、\、|、/这四个字符做个旋转的加载动画对吧?我给你分两种常见场景讲具体实现,不管是写控制台脚本还是Flutter应用都能搞定~

一、控制台环境下的实现(适合脚本工具)

控制台里实现这个动画很直接,核心思路是用回车符覆盖当前行的字符,配合延迟循环来实现旋转效果:

import 'dart:io';
import 'dart:async';

void main() async {
  final spinnerChars = ["-", "\\", "|", "/"];
  int currentIndex = 0;
  
  // 无限循环(你也可以改成固定次数,比如for循环跑10次)
  while (true) {
    // 用stdout.write而不是print,避免自动换行;\r让光标回到行首覆盖之前的字符
    stdout.write('\r${spinnerChars[currentIndex]}');
    // 索引循环递增,模运算保证不会越界
    currentIndex = (currentIndex + 1) % spinnerChars.length;
    // 控制动画速度,150ms的间隔看起来比较流畅
    await Future.delayed(const Duration(milliseconds: 150));
  }
}

关键细节说明:

  • stdout.write('\r...'):\r是回车符,会让光标回到当前行的开头,这样下一次输出的字符就能直接覆盖之前的,不会换行刷屏。
  • Future.delayed:异步延迟,避免阻塞主线程,让动画能流畅运行。
  • 模运算%:确保索引永远在列表长度范围内,实现循环遍历。

二、Flutter环境下的实现(适合UI界面)

如果是在Flutter应用里做这个动画,需要借助状态管理来更新UI,这里用StatefulWidget配合定时器来实现:

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

class RotatingSpinner extends StatefulWidget {
  const RotatingSpinner({super.key});

  @override
  State<RotatingSpinner> createState() => _RotatingSpinnerState();
}

class _RotatingSpinnerState extends State<RotatingSpinner> {
  final List<String> _spinnerChars = ["-", "\\", "|", "/"];
  int _currentIndex = 0;
  Timer? _animationTimer;

  @override
  void initState() {
    super.initState();
    // 启动周期性定时器,每隔150ms更新一次状态
    _animationTimer = Timer.periodic(
      const Duration(milliseconds: 150),
      (timer) {
        setState(() {
          // 更新索引,触发UI重绘
          _currentIndex = (_currentIndex + 1) % _spinnerChars.length;
        });
      },
    );
  }

  @override
  void dispose() {
    // 页面销毁时一定要取消定时器,避免内存泄漏
    _animationTimer?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Text(
      _spinnerChars[_currentIndex],
      style: const TextStyle(
        fontSize: 28,
        fontWeight: FontWeight.bold,
      ),
    );
  }
}

// 用法示例:在页面中引用这个Spinner组件
class DemoPage extends StatelessWidget {
  const DemoPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("旋转加载动画")),
      body: const Center(child: RotatingSpinner()),
    );
  }
}

关键细节说明:

  • Timer.periodic:周期性触发状态更新,驱动动画循环。
  • setState:通知Flutter框架更新UI,显示新的字符。
  • dispose方法:必须在组件销毁时取消定时器,否则会导致内存泄漏问题。

你可以根据需求调整延迟时间(比如改成100ms会更快,200ms会更慢),或者给字符加个颜色、放大字号让动画更显眼~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:26:37