You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Flutter中实现类似Android的文字转语音按钮网格功能?

Flutter实现文字转语音网格按钮方案

当然可以!我帮你把Android里的文字转语音+网格按钮功能搬到Flutter里,下面是完整的实现步骤和代码:

1. 添加依赖

首先在你的pubspec.yaml文件中引入flutter_tts包(这是Flutter生态里常用的文字转语音插件):

dependencies:
  flutter:
    sdk: flutter
  flutter_tts: ^3.6.0 # 可以替换为最新版本

然后执行flutter pub get命令安装依赖。

2. 核心功能与布局实现

我们用StatefulWidget来管理TTS的生命周期,搭配GridView.count实现类似Android GridView的网格按钮布局,点击按钮即可触发文字朗读。

完整代码示例

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

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'TTS Grid Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const TtsGridScreen(),
    );
  }
}

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

  @override
  State<TtsGridScreen> createState() => _TtsGridScreenState();
}

class _TtsGridScreenState extends State<TtsGridScreen> {
  final FlutterTts _flutterTts = FlutterTts();
  final List<String> _words = ["Flutter", "Dart", "React", "Java"];
  bool _isTtsReady = false;

  @override
  void initState() {
    super.initState();
    _initTextToSpeech();
  }

  // 初始化TTS引擎
  Future<void> _initTextToSpeech() async {
    await _flutterTts.setLanguage("en-US"); // 设置朗读语言为英文
    await _flutterTts.setPitch(1.0); // 音调范围0.5-2.0,1.0为默认
    await _flutterTts.setSpeechRate(0.6); // 语速范围0.1-2.0,数值越小越慢

    setState(() {
      _isTtsReady = true;
    });
  }

  // 触发朗读逻辑
  Future<void> _readWord(String word) async {
    if (_isTtsReady) {
      await _flutterTts.speak(word);
    }
  }

  @override
  void dispose() {
    // 页面销毁时释放TTS资源,避免内存泄漏
    _flutterTts.stop();
    _flutterTts.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("文字转语音网格")),
      body: GridView.count(
        crossAxisCount: 2, // 每行显示2个按钮
        padding: const EdgeInsets.all(16),
        crossAxisSpacing: 16,
        mainAxisSpacing: 16,
        children: _words.map((word) {
          return ElevatedButton(
            onPressed: () => _readWord(word),
            child: Text(
              word,
              style: const TextStyle(fontSize: 18),
            ),
          );
        }).toList(),
      ),
    );
  }
}

额外说明

  • 如果需要支持中文朗读,只需把setLanguage的参数改为"zh-CN"即可
  • 可以调整crossAxisCount来修改每行的按钮数量,适配不同屏幕
  • Android设备默认自带TTS引擎,若遇到无法朗读的情况,提醒用户检查系统TTS引擎是否正常
  • 可以根据需求自定义按钮样式、朗读的音调/语速参数

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

火山引擎 最新活动