get static method

Future<Digest?> get(
  1. File file, {
  2. required int size,
  3. void onProgress(
    1. bool done,
    2. double progress
    )?,
  4. ValueNotifier<bool>? canceled,
})

Implementation

static Future<crypto.Digest?> get(
  File file, {
  required int size,
  void Function(bool done, double progress)? onProgress,
  ValueNotifier<bool>? canceled,
}) async {
  var innerSink = DigestSink();
  var outerSink = crypto.md5.startChunkedConversion(innerSink);

  final startTime = kDebugMode ? DateTime.now().millisecondsSinceEpoch : 0;
  final reader = FileReader();
  const bufferSize = 4096 * 64;
  var start = 0;
  var readed = 0;

  try {
    while (!(canceled?.value ?? false) && start < size) {
      final end = start + bufferSize > size ? size : start + bufferSize;
      final blob = file.slice(start, end);
      reader.readAsArrayBuffer(blob);
      await reader.onLoad.first;
      outerSink.add(reader.result as List<int>);

      readed += end - start;
      start += bufferSize;

      if (null != onProgress) {
        onProgress(false, readed.toDouble() / size);
      }
    }

    if (kDebugMode) {
      final delta = DateTime.now().millisecondsSinceEpoch - startTime;
      print('MD5 time $delta');
    }
  } finally {
    outerSink.close();
  }

  if (canceled?.value ?? false) {
    return null;
  }

  if (null != onProgress) {
    onProgress(true, 1.0);
  }

  return innerSink.value;
}