Flattern: Der TextField onChanged-Handler verschluckt stillschweigend Ausnahmen
Wenn eine Ausnahme in einem TextField.onChangedHandler ausgelöst und nicht behandelt wird, sprudelt sie nicht zum globalen Flutter.onErrorHandler, sodass sie stillschweigend übersehen wird. Gibt es eine Möglichkeit, diese Fehler global zu behandeln, sodass ich zumindest weiß, dass sie bei der Entwicklung ausgelöst werden?
Es scheint gefangen zu sein und in ein Objekt umgewandelt zu werden MethodChannel._handleAsMethodCall(), aber ich verstehe nicht, wie es von dort aus gehandhabt wird.
main() {
runApp(Test());
}
class Test extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: TextField(
decoration: InputDecoration(
labelText: "Input",
),
onChanged: (input) {
throw Exception(); // <-------- swallowed by framework
},
),
),
),
);
}
}
Antworten
Das Problem ist, dass Sie anrufen müssen, WidgetsFlutterBinding.ensureInitialized()bevor Sie Ihren benutzerdefinierten Fehlerbehandler zuweisen können - der folgende Code funktioniert für mich:
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized(); // <- this needs to happen before assigning your error handler
FlutterError.onError = (FlutterErrorDetails details) => print('custom error handling');
runApp(Test());
}
class Test extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: TextField(
decoration: InputDecoration(
labelText: "Input",
),
onChanged: (input) {
print(input);
throw Exception();
},
),
),
),
);
}
}
Die Konsolenausgabe beim Schreiben von 'uiae':
Performing hot restart...
Syncing files to device Chrome...
Restarted application in 434ms.
u
custom error handling
ui
custom error handling
uia
custom error handling
uiae
custom error handling
Vielleicht möchten Sie auch einen Blick auf Flutter werfen : So implementieren Sie FlutterError.OnError korrekt und Flutter fängt alle nicht behandelten Ausnahmen ab, da sie mit Ihrem Problem in Zusammenhang zu stehen scheinen.