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

如何在Flutter中获取flutter_tts的TTS状态并更新UI

使用flutter_tts监听TTS状态并更新UI

flutter_tts 提供了一系列回调方法来监听TTS的不同运行状态,你可以通过这些回调更新组件状态,进而实现UI的动态变化。以下是具体实现步骤:

1. 初始化flutter_tts实例

在你的StatefulWidget的State类中,先定义并初始化flutter_tts实例:

import 'package:flutter_tts/flutter_tts.dart';

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

  @override
  State<TtsDemo> createState() => _TtsDemoState();
}

class _TtsDemoState extends State<TtsDemo> {
  late FlutterTts flutterTts;
  bool isSpeaking = false;
  String statusText = "未开始朗读";

  @override
  void initState() {
    super.initState();
    flutterTts = FlutterTts();
    _setupTtsCallbacks();
  }

2. 绑定状态回调方法

创建一个方法来设置TTS的各种状态回调,在回调内通过setState更新UI状态变量:

void _setupTtsCallbacks() {
  // 朗读完成时触发
  flutterTts.setCompletionHandler(() {
    setState(() {
      isSpeaking = false;
      statusText = "朗读已完成";
    });
  });

  // 朗读开始时触发
  flutterTts.setStartHandler(() {
    setState(() {
      isSpeaking = true;
      statusText = "正在朗读...";
    });
  });

  // 朗读暂停时触发
  flutterTts.setPauseHandler(() {
    setState(() {
      isSpeaking = false;
      statusText = "朗读已暂停";
    });
  });

  // 朗读继续时触发
  flutterTts.setContinueHandler(() {
    setState(() {
      isSpeaking = true;
      statusText = "继续朗读...";
    });
  });

  // 朗读出错时触发
  flutterTts.setErrorHandler((errorMsg) {
    setState(() {
      isSpeaking = false;
      statusText = "朗读出错:$errorMsg";
    });
  });
}

3. 实现朗读控制方法

添加朗读、暂停、继续的控制方法:

Future<void> _startSpeaking() async {
  await flutterTts.speak("这是一段用于测试的朗读文本");
}

Future<void> _pauseSpeaking() async {
  await flutterTts.pause();
}

Future<void> _resumeSpeaking() async {
  await flutterTts.resume();
}

4. 根据状态渲染UI

在build方法中,根据状态变量动态展示UI内容:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: const Text("TTS状态演示")),
    body: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text(statusText, style: const TextStyle(fontSize: 18, height: 1.5)),
          const SizedBox(height: 30),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: isSpeaking ? null : _startSpeaking,
                child: const Text("开始朗读"),
              ),
              const SizedBox(width: 15),
              ElevatedButton(
                onPressed: isSpeaking ? _pauseSpeaking : null,
                child: const Text("暂停"),
              ),
              const SizedBox(width: 15),
              ElevatedButton(
                onPressed: !isSpeaking ? _resumeSpeaking : null,
                child: const Text("继续"),
              ),
            ],
          )
        ],
      ),
    ),
  );
}

5. 释放资源

在组件销毁时,记得停止TTS并释放资源:

@override
void dispose() {
  flutterTts.stop();
  flutterTts.dispose();
  super.dispose();
}

这样,当TTS的状态发生变化时,对应的回调会触发setState更新状态变量,Flutter会自动重建UI,实现状态与UI的同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:13:02