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

Flutter speech_to_text模块变量报错求助:代码与依赖均已正确配置仍出现异常

解决SpeechToText变量初始化报错问题

嘿,作为Flutter新手遇到这种变量相关的报错太正常了,我帮你揪出代码里的问题~

你的核心问题在于**_speech变量没有初始化**,现在Dart默认开启了非空安全,你声明了stt.SpeechToText _speech;但没有给它赋值,编译器会判定这个变量可能为null,不符合非空类型的要求,所以抛出报错。

修复步骤:

  1. _SpeechScreenState类里添加initState生命周期方法,用来初始化SpeechToText实例,同时处理语音识别必需的权限请求。
  2. 调整_speech变量的声明,要么标记为可空类型,要么直接在声明时初始化,推荐结合initState来完成初始化逻辑。

修改后的完整代码:

import 'package:flutter/material.dart';
import 'package:speech_to_text/speech_to_text.dart' as stt;

void main() {
  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Voice',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: SpeechScreen(),
    );
  }
}

class SpeechScreen extends StatefulWidget {
  @override
  _SpeechScreenState createState() => _SpeechScreenState();
}

class _SpeechScreenState extends State<SpeechScreen> {
  // 将变量标记为可空,后续在initState中初始化
  stt.SpeechToText? _speech;
  bool _isListening = false;
  String _text = 'Press the button to start speaking';
  double _confidence = 1.0;

  @override
  void initState() {
    super.initState();
    // 初始化SpeechToText实例
    _speech = stt.SpeechToText();
    // 调用初始化方法处理权限与可用性检查
    _initSpeech();
  }

  // 语音识别初始化方法
  void _initSpeech() async {
    bool available = await _speech!.initialize(
      onStatus: (status) => print('识别状态: $status'),
      onError: (error) => print('识别错误: $error'),
    );
    if (available) {
      print('语音识别已准备就绪');
    } else {
      print('当前设备不支持语音识别');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Flutter Voice')),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Text(_text, textAlign: TextAlign.center),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _listen,
        child: Icon(_isListening ? Icons.mic_off : Icons.mic),
      ),
    );
  }

  // 语音监听控制方法
  void _listen() async {
    if (!_isListening) {
      bool available = await _speech!.initialize(
        onStatus: (status) {
          setState(() {
            _isListening = status == 'listening';
          });
        },
        onError: (error) => print('识别错误: $error'),
      );
      if (available) {
        setState(() => _isListening = true);
        _speech!.listen(
          onResult: (result) => setState(() {
            _text = result.recognizedWords;
            if (result.confidence > 0) {
              _confidence = result.confidence;
            }
          }),
        );
      }
    } else {
      setState(() => _isListening = false);
      _speech!.stop();
    }
  }
}

关键改动说明:

  • stt.SpeechToText _speech;改为stt.SpeechToText? _speech;(标记为可空类型),并在initState中完成实例初始化_speech = stt.SpeechToText();
  • 添加了_initSpeech方法,处理语音识别的权限请求与可用性检查,这是SpeechToText模块正常工作的必需步骤
  • 完善了界面布局,添加了可交互的按钮和文本展示区域,方便你测试语音识别功能

另外别忘了配置平台权限:

  • Android:在AndroidManifest.xml中添加<uses-permission android:name="android.permission.RECORD_AUDIO" />
  • iOS:在Info.plist中添加NSSpeechRecognitionUsageDescriptionNSMicrophoneUsageDescription权限描述

这样修改后,变量初始化的报错就解决了,你也能正常使用语音识别功能啦~

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

火山引擎 最新活动