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的主要内容,如果未能解决你的问题,请参考以下文章

Flutter app:如何实现正确的注销功能?

不确定如何正确实现 ChangeNotifierProvider 以记住 Flutter 中的登录用户

flutter - bloc - 我如何在我的 Ui 中使用 FutureBuilder 来正确实现 Bloc 架构

flutter 如何实现文件读写(使用篇)

如何使用提供的建议生成在不正确的单词下划线的 Flutter 文本字段?

Flutter:如何正确读取 JSON 中的字段?