【问题标题】:Unhandled Exception: type 'Uint8List' is not a subtype of type 'int'未处理的异常:“Uint8List”类型不是“int”类型的子类型
【发布时间】:2020-12-22 06:29:52
【问题描述】:

我正在使用 Dio 尝试获取以二进制形式存储在数据库中的图像流。每当我尝试从 Flutter 获取图像时,都会出现错误

未处理的异常:“Uint8List”类型不是“int”类型的子类型

当前设置流将二进制数据转换为 List(Uint8List),但我需要它是 List(int)

如果有任何帮助,我将不胜感激

到目前为止我做了什么

var imageBinary = await Dio().get(userUri + "/" + id.toString(), options: Options(headers: {"authorization": "Bearer $token"}, responseType: ResponseType.stream));
    var temp = await imageBinary.data.stream.toList();
    img = List.from(temp);
    photo = Image.memory(img);

【问题讨论】:

  • 浏览你的链接userUri + "/" + id.toString()返回的是什么类型的数据?

标签: flutter dart


【解决方案1】:

嗯,看来asTypedList 应该这样做:

文档: 在地址空间中创建由内存支持的类型化列表视图。 返回的视图将允许访问从地址到地址 + 长度的内存范围。 用户必须确保在使用返回的列表时可以访问内存范围。 https://api.dart.dev/stable/2.6.0/dart-ffi/Uint8Pointer/asTypedList.html

external Uint8List asTypedList(int length);

【讨论】:

  • 我应该把这个放在哪里?
【解决方案2】:

List<Uint8List> 基本上是List<List<int>>,所以把它转换成List<int> 你必须把它弄平。下面的 sn -p 应该可以做到。

  var img = List.from(temp).expand((i) => i).toList(); 

但我认为在您的特定场景中使用ReponseType.bytes 会更好。这是一个意见,因为您正在等待下一行中的流,您开始获取它。也许,您共享的代码只是为了这个问题,实际上,您可能有充分的理由使用流。但我想提一下。

如果你想使用ResponseType.bytes:

var imageBinary = await Dio().get(userUri + "/" + id.toString(), options: Options(headers: {"authorization": "Bearer $token"}, responseType: ResponseType.bytes));
var img = imageBinary.data; // this will be UintList8 (or in other words List<int>
var photo = Image.memory(img);

【讨论】:

  • 可以告诉我如何使用ReponseType.bytes,因为使用img = List.from(temp).expand((i) =&gt; i).toList() 会引发错误Unhandled Exception: type 'List&lt;dynamic&gt;' is not a subtype of type 'List&lt;int&gt;'
  • @blackbird 用代码更新了答案。
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 2021-11-28
  • 2021-07-08
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多