import 'dart:async'; import 'package:flutter/services.dart'; /// Dart 侧对 iOS SpeechEnginePlugin 的包装。 /// /// 所有方法都 forwards 到 MethodChannel;事件流通过 [events] 暴露原始字典, /// 上层 VoiceChatController 负责解析为状态变化。 class SpeechEnginePlugin { static const MethodChannel _method = MethodChannel('avatar_flutter_app/speech_engine'); static const EventChannel _event = EventChannel('avatar_flutter_app/speech_events'); Stream>? _events; /// 事件流:每个事件都是 `{type: ..., ...payload}` 形式的 Map。 /// type 取值:engine_start / engine_stop / engine_error / /// asr_partial / asr_end / chat_partial / chat_end / /// mouth_value / raw Stream> get events => _events ??= _event.receiveBroadcastStream().map(_castMap); static Map _castMap(dynamic raw) { if (raw is Map) { return raw.map((k, v) => MapEntry(k.toString(), v)); } return {'type': 'raw', 'payload': raw?.toString() ?? ''}; } Future init({ required String appId, required String appKey, required String token, required String dialogId, required String uid, required String address, required String uri, String botName = '豆包', String aecModelPath = '', }) async { await _method.invokeMethod('init', { 'appId': appId, 'appKey': appKey, 'token': token, 'dialogId': dialogId, 'uid': uid, 'address': address, 'uri': uri, 'botName': botName, 'aecModelPath': aecModelPath, }); } Future start() => _method.invokeMethod('start'); Future startTalking() => _method.invokeMethod('startTalking'); Future finishTalking() => _method.invokeMethod('finishTalking'); Future pauseTalking() => _method.invokeMethod('pauseTalking'); Future resumeTalking() => _method.invokeMethod('resumeTalking'); Future cancelCurrentDialog() => _method.invokeMethod('cancelCurrentDialog'); Future sayHello(String content) => _method.invokeMethod('sayHello', {'content': content}); Future stop() => _method.invokeMethod('stop'); Future destroy() => _method.invokeMethod('destroy'); }