| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import 'dart:async';
- import 'package:flutter/material.dart';
- class TypewriterText extends StatefulWidget {
- final String text; // 要显示的完整文本
- final TextStyle? style; // 字体样式
- final Duration speed; // 每个字出现的速度
- final VoidCallback? onComplete; // 打字完成回调
- final bool repeat; // 是否循环播放
- const TypewriterText({
- super.key,
- required this.text,
- this.style,
- this.speed = const Duration(milliseconds: 80),
- this.onComplete,
- this.repeat = false,
- });
- @override
- _TypewriterTextState createState() => _TypewriterTextState();
- }
- class _TypewriterTextState extends State<TypewriterText> {
- String _displayedText = '';
- int _charIndex = 0;
- Timer? _timer;
- @override
- void initState() {
- super.initState();
- _startTyping();
- }
- void _startTyping() {
- _displayedText = '';
- _charIndex = 0;
- _timer?.cancel();
- _timer = Timer.periodic(widget.speed, (timer) {
- if (_charIndex < widget.text.length) {
- setState(() {
- _displayedText += widget.text[_charIndex];
- });
- _charIndex++;
- } else {
- _timer?.cancel();
- widget.onComplete?.call();
- if (widget.repeat) {
- Future.delayed(Duration(seconds: 1), _startTyping);
- }
- }
- });
- }
- @override
- void dispose() {
- _timer?.cancel();
- super.dispose();
- }
- @override
- Widget build(BuildContext context) {
- return Text(
- _displayedText,
- style: widget.style ?? const TextStyle(fontSize: 18),
- );
- }
- }
|