readAt method
Reads into dst[start..end) at offset. Returns bytes read (0 at EOF).
Implementation
@override
Future<int> readAt(
int offset,
Uint8List dst, {
int start = 0,
int? end,
}) async {
if (_closed) throw StateError('Blob is closed');
final stop = end ?? dst.length;
RangeError.checkValidRange(start, stop, dst.length);
if (offset < 0) throw RangeError.value(offset, 'offset');
if (start == stop || offset >= _length) return 0;
final want = (stop - start) < (_length - offset)
? stop - start
: _length - offset;
if (want <= 0) return 0;
if (_cacheLimit > 0 && _whole == null && _length <= _cacheLimit) {
final buffer = await _blob.arrayBuffer().toDart;
_whole = buffer.toDart.asUint8List();
}
final whole = _whole;
if (whole != null) {
dst.setRange(start, start + want, whole, offset);
return want;
}
final slice = _blob.slice(offset, offset + want);
final buffer = await slice.arrayBuffer().toDart;
final bytes = buffer.toDart.asUint8List();
final n = bytes.length < want ? bytes.length : want;
dst.setRange(start, start + n, bytes);
return n;
}