decodeModelBytes function
Future<ModelDocument>
decodeModelBytes(
- ModelLoadRequest request,
- Uint8List bytes,
- AssetUriResolver resolveUri
Decodes already-read bytes with an explicit resolver.
The seam the isolate path uses: bytes and a resolver are both sendable-friendly, while an AssetSource that reaches for the asset bundle is not usable off the UI isolate.
Implementation
Future<ModelDocument> decodeModelBytes(
ModelLoadRequest request,
Uint8List bytes,
AssetUriResolver resolveUri,
) {
// An application's own decoders first, so it can add a format and replace one.
// Asked before the format is resolved at all: a decoder that recognises its
// own file is a better authority than a suffix table this package wrote.
for (final decoder in request.decoders) {
if (!decoder.handles(request.source.fileName.toLowerCase(), bytes)) {
continue;
}
final task = developer.TimelineTask()
..start(
'decode ${decoder.runtimeType}',
arguments: <String, Object?>{'bytes': bytes.length},
);
return decoder.decode(bytes, request, resolveUri).whenComplete(task.finish);
}
final format = _resolveFormat(request, bytes);
// Named after the format so the background isolate's span says which decoder
// the time went into, rather than just "decode".
final task = developer.TimelineTask()
..start(
'decode ${format.name}',
arguments: <String, Object?>{'bytes': bytes.length},
);
return builtInModelDecoder(
format,
request,
).decode(bytes, request, resolveUri).whenComplete(task.finish);
}