0

注意:请不要根据“最小可重现示例所需的更多代码”做出下意识的关闭建议,尤其是在您不理解该问题的情况下。如果你按照我的逻辑,我想你会发现不需要更多的代码。

我正在做一些特定于平台的 Flutter 代码,其中我有一个平台方法“stopRec”(停止录制),它等待来自本机主机的字节数组。

在 Dart 方面,它看起来像这样:

Uint8List? recordedBytes;
recordedBytes = await platform.invokeMethod('stopRec');

如您所见,它期望得到一个字节数组(Dart Uint8List)。

我已经编写了 Android 代码并且它可以工作——它测试得很好,记录的字节可以通过并正确播放。

这是 Android (Java) 代码的样子:

byte[] soundBytes = recorder.getRecordedBytes();
result.success(soundBytes);

我希望您理解为什么在这个问题中还不需要“更多代码”。

但是,在 IOS 端继续,调用平台方法时出现以下错误:

[VERBOSE-2:ui_dart_state.cc(209)] 未处理的异常:类型 'List<Object?>' 不是类型 'Uint8List?' 的子类型 在类型转换中

发生错误的 Dart 行是:

recordedBytes = await platform.invokeMethod('stopRec'); 

所以发生的事情是它没有得到它期望从 IOS 发回的 Dart Uint8List。

IOS 代码如下所示:

var dartCompatibleAudioBytes:[UInt8]?
var audioBytesAsDataFromRecorder: Data?

// ..... platform channel section 
    case "stopRec":
        self?.stopRec()
        result(self?.dartCompatibleAudioBytes!) // <---- wrong data type getting sent back here
        break
// ..... platform channel section 


private func stopRec() {
    myRecorder.stopRecording()
    audioBytesAsDataFromRecorder = myRecorder.getRecordedAudioFileBytesAsData()
    dartCompatibleAudioBytes = [UInt8] (audioBytesAsDataFromRecorder!)
}

我已经测试了与未连接到 Flutter 的独立 IOS 应用程序相同的 IOS 实现代码,因此我知道在 stopRec() 方法结束时,dartCompatibleAudioBytes 变量确实包含正确播放的预期数据。

我希望你能明白为什么“更多代码”仍然没有必要。

  • Dart 代码有效
  • Android 代码有效
  • Dart 代码与 Android 代码协同工作
  • IOS代码有效
  • IOS 代码不能与 Dart 代码一起使用

使用我所展示的内容,任何人都可以立即看到为什么预期的数据类型没有通过方法通道返回?

4

1 回答 1

1

根据文档,您应该FlutterStandardTypedData(bytes: Data)在 swift 中使用,以便像Uint8List在 dart 中那样反序列化它。

于 2021-12-11T03:20:06.153 回答