Flutter:如何正确实现 FlutterError.OnError
Posted
技术标签:
【中文标题】Flutter:如何正确实现 FlutterError.OnError【英文标题】:Flutter: How to implement FlutterError.OnError correctly 【发布时间】:2019-06-15 02:52:33 【问题描述】:谁能告诉我如何在小部件测试期间实现覆盖颤振错误,以便我可以检查自己的自定义错误。
我在网上看到 sn-ps 提到了这一点,但我所有的实现都失败了
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 following UnrecognizedTermException was thrown running a test:
Instance of 'UnrecognizedTermException'
...
我读到您可以执行以下 sn-p 之类的操作,但它没有看到如何/在何处实现它:
final errorHandled = expectAsync0(());
FlutterError.onError = (errorDetails)
// handle error
errorHandled();
);
【问题讨论】:
【参考方案1】:我在生产环境中使用以下代码将错误记录到服务器。
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
【讨论】:
最初的问题更多是关于小部件测试和自定义错误,而不是从源代码记录错误。由于expect
不起作用并且FlutterError.onError
建议与expectAsync0
一起使用,因此答案应与在小部件单元测试中测试自定义错误的方式一致。【参考方案2】:
这是为测试而设计的。我切换到在 try/catch 中包装逻辑,然后在“错误消息文本”呈现概念上运行 expect()。例如:
try
throw new UnrecognizedTermException();
catch (e)
setState(() => _status = e.errMsg());
// then in my test
expect(find.text('Could not determine the type of item you scanned'), findsOneWidget);
【讨论】:
因此,如果我理解正确,您在应用程序中管理了异常并停止尝试在测试中捕获它。是这样吗? 是的,这是正确的。我正在检查我的自定义异常的“行为”或“工件”,而不是异常本身 好的。我很想知道您在问题中解释的问题是否真的有解决方案,或者是否唯一的方法是通过解决方法。我的情况非常相似,不想通过捕获它来释放异常。以上是关于Flutter:如何正确实现 FlutterError.OnError的主要内容,如果未能解决你的问题,请参考以下文章
不确定如何正确实现 ChangeNotifierProvider 以记住 Flutter 中的登录用户
flutter - bloc - 我如何在我的 Ui 中使用 FutureBuilder 来正确实现 Bloc 架构