readAt method

  1. @override
Future<int> readAt(
  1. int offset,
  2. Uint8List dst, {
  3. int start = 0,
  4. int? end,
})

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;
}