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
相关产品推荐
相关产品推荐

