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

Flutter初始化flutter_tts崩溃:Android4.4.4设备遇NoSuchMethodError

解决Flutter中flutter_tts 4.0.2在Android 4.4.4上启动崩溃的问题

崩溃的核心原因是flutter_tts 4.0.2的Android原生代码在类加载阶段就调用了仅Android 5.0(API 21)及以上才有的TextToSpeech.getDefaultVoice()方法,导致你的Flutter层SDK版本判断还没执行,就触发了NoSuchMethodError。以下是几种可行的解决办法:

方法一:延迟初始化flutter_tts实例

不要在全局变量、Widget的initState等早期生命周期里直接实例化FlutterTts对象,而是等到确认设备SDK版本符合要求后再初始化,避免提前触发原生库加载:

import 'package:flutter_tts/flutter_tts.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'dart:io';

FlutterTts? _flutterTts;

// 仅在需要使用TTS时调用此方法
Future<void> initTtsIfSupported() async {
  if (!Platform.isAndroid) {
    _flutterTts = FlutterTts();
    // 其他平台初始化逻辑
    return;
  }

  final androidInfo = await DeviceInfoPlugin().androidInfo;
  if (androidInfo.version.sdkInt >= 21) {
    _flutterTts = FlutterTts();
    // 配置TTS参数等初始化操作
  } else {
    // 提示用户设备不支持TTS或做降级处理
  }
}

关键是不要提前创建FlutterTts实例,因为一旦实例化,Flutter会立即尝试加载对应的原生插件类,触发崩溃。

方法二:修改flutter_tts的Android原生代码

如果可以自行fork并修改flutter_tts的原生代码,找到Android端插件类(通常是FlutterTtsPlugin.java),把所有调用getDefaultVoice()的地方用SDK版本判断包裹:

import android.os.Build;
import android.speech.tts.TextToSpeech;
import android.speech.tts.Voice;

// 在使用getDefaultVoice的位置添加判断
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  Voice defaultVoice = tts.getDefaultVoice();
  // 原有的defaultVoice处理逻辑
} else {
  // 兼容API 19的逻辑,比如返回null或默认配置
}

同时检查插件的初始化代码,确保没有在类静态代码块或构造函数中执行高版本API调用,把这些逻辑放到动态初始化方法中并添加版本判断。

方法三:降级flutter_tts到兼容旧版本的版本

flutter_tts 4.x版本可能引入了对高版本Android API的依赖,你可以尝试降级到3.x系列的稳定版本(比如3.5.0),这些版本的原生代码可能还没有使用getDefaultVoice()这类API,能在Android 4.4.4上正常启动。修改pubspec.yaml:

dependencies:
  flutter_tts: ^3.5.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:33:29