我正在运行一个返回javascript Buffer对象的云函数。一些沿着的事情:
functions
.region("europe-west2")
.runWith({ timeoutSeconds: 20, memory: "128MB", })
.https
.onCall(async (data, context) => {
const buffer = await sharp(imagePath).toBuffer();
return buffer;
});
在我的仓库中,我这样调用这个云函数:
Future<Uint8List> resizeImage({required String fileName}) async {
try {
final result = await firebaseFunctions
.httpsCallable('resizeImage')
.call<dynamic>({'fileName': fileName});
//printing result.data returns a IdentityMap<String, dynamic>.
} on FirebaseFunctionsException catch (e) {
//handle error
}
}
当我打印result.data.runtimeType时,它是一个类似于下面的map对象:{12: 239, 2938: 293}
如何将此Map转换为UInt8List?
2条答案
按热度按时间emeijp431#
原来我必须获取IdentityMap的值并将它们转换为List。
返回的数据不是
{12: 239, 2938: 293}
,而是{0: 239, 1: 293, 2:382}
,因此它是基于索引的。我是这样解决的:9ceoxa922#
请注意,Map的值的顺序是不保证的。您的解决方案可能有效,具体取决于实现,但下面的代码并不假定Map的值将以正确的顺序迭代
如果键不是字符串,就不需要将它们解析为int,但我的键在本例中是int。
另请注意:返回缓冲区不是这里的最佳实践。您的解决方案和我上面的解决方案都很好,但更简单,更有效的解决方案是返回base64编码的字节。这种编码导致通过网络连接发送的字节显著减少。
在云函数中:
在应用程序中: