logException method

Future<void> logException(
  1. dynamic exception,
  2. bool handled, [
  3. dynamic stackTrace
])

Implementation

Future<void> logException(dynamic exception, bool handled,
    [dynamic stackTrace]) async {
  final Chain chain = _getStackTraceChain(stackTrace);

  final List<Map<String, dynamic>> frames = <Map<String, dynamic>>[];

  var ds = AccumulatorSink<Digest>();
  var s = sha1.startChunkedConversion(ds);

  s.add(utf8.encode(getApplicationVersionInternal()));

  for (var trace in chain.traces) {
    for (var frame in trace.frames) {
      frames.add(_constructFrame(frame));
      s.add(utf8.encode(frame.location));
    }
  }

  s.close();

  // Assuming you want to send the location of the first frame
  final Frame? firstFrame =
      chain.traces.expand((trace) => trace.frames).firstOrNull;

  final String location = firstFrame != null
      ? '${firstFrame.member} (${firstFrame.uri.toString().split('/').last}:${firstFrame.line})'
      : 'unknown';

  await _channel.invokeMethod('logException', <String, dynamic>{
    'name': exception.runtimeType.toString(),
    'reason': exception.toString(),
    'stackTrace': frames.map((frame) => json.encode(frame)).toList(),
    'handled': handled,
    'signature': ds.events.single.toString(),
    'location': location,
  });
}