如何在没有镜像程序包的情况下使用ByteData和ByteBuffer

时间:2018-08-11 15:13:54

标签: dart udp flutter

我正在尝试开发一个UDP应用程序,该应用程序可以接收数据并将字节转换为不同的数据类型。

我下面的代码可以单独使用Dart。

import 'dart:io';
import 'dart:typed_data';
import 'dart:mirror';

RawDatagramSocket.bind(InternetAddress.ANY_IP_V4, 20777).then((RawDatagramSocket socket){
  socket.listen((RawSocketEvent e){
    Datagram d = socket.receive();
    if (d == null) return;
    ByteBuffer buffer = d.data.buffer;
    DKByteData data = new DKByteData(buffer);
    exit(0);
  });
});

唯一的问题是,当我尝试在Flutter应用程序中运行它时,VS代码在d.data.buffer上给我一个错误,提示The getter 'buffer' isn't defined for the class 'List<int>'.

import dart:mirror;似乎在抖动中不起作用,this page说在Flutter中飞镖镜被遮挡了。

由于我无法导入飞镖镜像以从数据报套接字获得字节缓冲区,我还能怎么做?

1 个答案:

答案 0 :(得分:2)

d.data的类型为普通List<int>,而不是Uint8ListList没有buffer的吸气剂,因此类型系统会抱怨。

如果您知道该值确实为Uint8List或其他类型数据,则可以在使用它之前对其进行强制转换:

ByteBuffer buffer = (d.data as Uint8List).buffer;

还要注意,Uint8List不一定会使用其整个缓冲区。也许做类似的事情:

Uint8List bytes = d.data;
DKByteData data = new DKByteData(bytes.buffer, bytes.offsetInBytes, bytes.lengthInBytes);

如果可能的话,并且如果DKByteData不支持它,那么在数据不填充缓冲区的情况下,您可能想分配一个新的缓冲区:

Uint8List bytes = d.data;
if (bytes.lengthInBytes != bytes.buffer.lengthInBytes) {
  bytes = Uint8List.fromList(bytes);
}
DKByteData data = new DKByteData(bytes.buffer);