Why does ByteData.view(buffer) throw NoSuchMethodError: Class 'String' has no instance method 'asByteData'

Why does ByteData.view(buffer) throw NoSuchMethodError: Class 'String' has no instance method 'asByteData'

我正在尝试读取 UDP 数据并将其转换为浮点数。

我知道我需要

  1. 从 RawDatagramSocket 接收数据报
  2. 从数据报中获取 ByteBuffer
  3. 将 ByteBuffer 转换为 ByteData
  4. 对 ByteData 使用 getFloat32 方法

这是损坏的代码:

import 'dart:io';
import 'dart:typed_data';
import 'dart:mirrors';

getTypeName(dynamic obj) {
  return reflect(obj).type.reflectedType.toString();
}

void main(List<String> args){
  RawDatagramSocket.bind("192.168.1.1", 4444).then((RawDatagramSocket socket){
    print('Datagram socket ready to receive');
    print('${socket.address.address}:${socket.port}');
    socket.listen((RawSocketEvent e){
      Datagram d = socket.receive();
      if (d == null) return;
      ByteBuffer buffer = getTypeName(d.data.buffer);
      ByteData bdata = new ByteData.view(buffer);
    });
  });
}

调试代码如下:

import 'dart:io';
import 'dart:typed_data';
import 'dart:mirrors';

getTypeName(dynamic obj) {
  return reflect(obj).type.reflectedType.toString();
}

void main(List<String> args){
  RawDatagramSocket.bind("192.168.1.1", 4444).then((RawDatagramSocket socket){
    print('Datagram socket ready to receive');
    print('${socket.address.address}:${socket.port}');
    socket.listen((RawSocketEvent e){
      Datagram d = socket.receive();
      if (d == null) return;
      print(d.data);
    });
  });
}

如果我使用以下命令启动 netcat nc -u 192.168.1.1 4444 并发送数据“1111”,我会从调试代码中打印出以下内容:

[49, 49, 49, 49, 10]

我理解这些值是“1111”后跟一个回车符的 assai 字符 return。

问题是,当我 运行 'broken code' 时,我最终收到以下消息:

Unhandled exception:
NoSuchMethodError: Class 'String' has no instance method 'asByteData'.
Receiver: "_ByteBuffer"
Tried calling: asByteData(0, null)
#0      Object._noSuchMethod (dart:core-patch/object_patch.dart:43)
#1      Object.noSuchMethod (dart:core-patch/object_patch.dart:47)
#2      new ByteData.view (dart:typed_data:449)
#3      main.<anonymous closure>.<anonymous closure> (file:///Users/iProgram/test.dart:17:25)
#4      _RootZone.runUnaryGuarded (dart:async/zone.dart:1307)
#5      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:330)
#6      _BufferingStreamSubscription._add (dart:async/stream_impl.dart:257)
#7      _StreamController&&_SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:796)
#8      _StreamController._add (dart:async/stream_controller.dart:667)
#9      _StreamController.add (dart:async/stream_controller.dart:613)
#10     new _RawDatagramSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1699)
#11     _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:760)
#12     _microtaskLoop (dart:async/schedule_microtask.dart:41)
#13     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50)
#14     _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:99)
#15     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:152)

问题是,当我没有使用字符串或 asByteData 命令时,为什么会出现错误 Class 'String' has no instance method 'asByteData'

我一直在使用以下文档:Dart - ByteData

谢谢

why am I getting the error Class 'String' has no instance method 'asByteData' when I am not using a string or the asByteData command?

调用堆栈显示了这里发生的事情:

Tried calling: asByteData(0, null)
#0      Object._noSuchMethod (dart:core-patch/object_patch.dart:43)
#1      Object.noSuchMethod (dart:core-patch/object_patch.dart:47)
#2      new ByteData.view (dart:typed_data:449)

您正在调用 new ByteData.view,它在内部调用 asByteData

ByteData.view 构造函数接受一个 ByteBuffer 但你传递给它的是一个字符串:

ByteBuffer buffer = getTypeName(d.data.buffer);

尽管您在这里写了 ByteBuffer,但您的 getTypeName() 函数实际上返回的是 String:

return reflect(obj).type.reflectedType.toString();