You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Web:从dart:js迁移到package:web处理Blob的问题解决

解决package:web中Uint8List转Blob的问题

错误原因

你自定义的JsUint8List扩展类型试图以Dart的Uint8List作为表示类型实现JSArray<JSAny>,但Uint8List既不是JSArray底层表示类型的子类型,也不属于JSArray<JSAny>的子类型,因此触发类型错误。

正确实现方式

无需自定义扩展类型,直接借助dart:js_interop提供的工具完成Dart类型到JS类型的转换:

@JS()
library image;

import 'package:flutter/services.dart';
import 'package:web/web.dart';
import 'dart:js_interop';
import 'dart:convert';

@JS('setImage')
external JSPromise _setImage(Blob data); // 对应外部JS文件中的setImage函数

void setImage(String data) {
  // 解码base64字符串为Dart Uint8List
  final uint8List = Uint8List.fromList(base64Decode(data));
  // 将Dart Uint8List转换为JS兼容的Uint8Array(实现JSAny接口)
  final jsUint8Array = uint8List.toJS();
  // 创建Blob要求的JSArray<JSAny>类型参数
  final blobParts = JSArray<JSAny>.from([jsUint8Array]);
  
  final blob = Blob(blobParts, BlobPropertyBag(type: 'image/png'));
  _setImage(blob);
}

简化写法

如果不需要单独处理数组,也可以直接将转换后的JS数组放入JSArray构造:

void setImage(String data) {
  final uint8List = Uint8List.fromList(base64Decode(data));
  final blob = Blob(
    JSArray<JSAny>.from([uint8List.toJS()]),
    BlobPropertyBag(type: 'image/png')
  );
  _setImage(blob);
}

关键说明

  • uint8List.toJS()是dart:js_interop为Uint8List提供的扩展方法,直接将Dart字节列表转换为JS端的Uint8Array(自动实现JSAny接口)。
  • JSArray<JSAny>.from()用于将Dart的Iterable转换为JS端的数组,满足Blob构造函数对参数类型的要求。

内容的提问来源于stack exchange,提问作者Roki Turner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:32:19