JS WebRTC应用移植Dart时createAnswer媒体约束格式报错求助
解决Dart中WebRTC createAnswer的约束格式错误问题
我之前在把WebRTC从JS移植到Dart 1.x版本时,也碰到过一模一样的Malformed constraints object错误!问题核心在于Dart对象和JS原生对象的结构差异,下面是具体的解决步骤和注意点:
1. 先明确JS中可行的约束格式
首先回忆一下你在JS里正常工作的约束写法,比如这类常见的配置:
const answerConstraints = { offerToReceiveAudio: true, offerToReceiveVideo: false, voiceActivityDetection: true };
2. 在Dart中正确转换约束对象
在Dart 1.24.3版本中,直接传递普通的Dart Map给createAnswer会导致底层JS API无法解析,必须用dart:js_util里的convertDartToNative_Dictionary方法把Dart结构转换成JS原生对象:
完整代码示例
import 'dart:html'; import 'dart:js_util' as js_util; void createAnswer(RtcPeerConnection peerConn) { // 先构造符合要求的Dart约束Map final dartConstraints = { 'offerToReceiveAudio': true, 'offerToReceiveVideo': false, 'voiceActivityDetection': true }; // 转换为JS原生可识别的字典对象 final jsConstraints = js_util.convertDartToNative_Dictionary(dartConstraints); // 调用createAnswer peerConn.createAnswer(jsConstraints).then((RtcSessionDescription answer) { // 这里处理你的answer逻辑,比如设置本地描述、发送给对等端等 peerConn.setLocalDescription(answer); }).catchError((err) { print('创建Answer失败:$err'); }); }
3. 避坑注意事项
- 键名必须是字符串:不能用Dart的符号(比如
Symbol('offerToReceiveAudio'))或者非字符串类型作为键,必须和JS中的键名完全一致。 - 值类型要匹配JS预期:布尔值用
true/false,数字用普通的Dart数值,不要用Dart特有的类型(比如int以外的数值类型)。 - 导入正确的库:确保你导入了
dart:js_util,否则找不到convertDartToNative_Dictionary方法。
如果是Dart 2.x及以上的新版本,其实已经不需要手动转换了,直接传递Dart Map就能被底层interop正确处理,但鉴于你参考的是1.24.3的文档,上面的方法应该能完美解决你的报错问题。
内容的提问来源于stack exchange,提问作者Jonas Bojesen
相关产品推荐
相关产品推荐

