Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flutter: How to implement FlutterError.OnError correctly

Can someone show me how to implement overriding flutter errors during widget test so I can check for my own custom errors.

I have seen snippets online mentioning this but all of my implementations fail

void main() {

  testWidgets('throws an error when scanning unknown term types', (WidgetTester tester) async {
    await tester.pumpWidget(injectTestWidget(new ItemScanScreen()));

    await tester.enterText(find.byKey(new Key('term')), '');
    await tester.tap(find.byIcon(Icons.send));
    await tester.pump();

    expect(
      tester.takeException(),
      isInstanceOf<UnrecognizedTermException>(),
      reason: 'should have thrown an UnrecognizedTermException error but didn\'t',
    );
  });
}

the code above fails with the message below even though it looks like it in fact 'caught' my error:

The following UnrecognizedTermException was thrown running a test:
Instance of 'UnrecognizedTermException'
...

I read that you could do something like the snippet below but it did not see how/where to implement it:

final errorHandled = expectAsync0((){});

FlutterError.onError = (errorDetails) {
  // handle error
  errorHandled();
});
like image 430
xpeldev Avatar asked Jan 21 '19 17:01

xpeldev


People also ask

How do you use onError in Flutter?

onError property Null safety Called whenever the Flutter framework catches an error. The default behavior is to call presentError. You can set this to your own function to override this default behavior. For example, you could report all errors to your server.


1 Answers

I use the code below in production to log errors to a server.

main.dart:

import 'dart:async';
import 'package:flutter/material.dart';
import 'logging.dart';

void main() async {
  FlutterError.onError = (FlutterErrorDetails details) async {
    new ErrorLogger().logError(details);
  };
  runZoned<Future<void>>(() async {
    // Your App Here
    runApp(MainApp());
  }, onError: (error, stackTrace) {
    new ErrorLogger().log(error, stackTrace);
  });
}

logging.dart:

class ErrorLogger {

  void logError(FlutterErrorDetails details) async {
    //FlutterError.dumpErrorToConsole(details);
    _sendToServer(details.exceptionAsString(), details.stack.toString());
  }

  void log(Object data, StackTrace stackTrace) async {  
      // print(data);
      // print(stackTrace);
    _sendToServer(data.toString(), stackTrace.toString());
  }

  void _sendToServer(String a, String b) async {
    // Implementation here
  }
}
like image 54
EderBaum Avatar answered Sep 28 '22 10:09

EderBaum