控制台中未显示 flutter 异常

标签 flutter dart exception textfield

我正在尝试调试 Flutter 应用程序。我注意到在某些情况下,会引发异常,但不会显示在控制台中。所以我花了一段时间才知道有一个异常(exception)。这浪费了很多时间。
这是一个显示问题的小代码片段。使用 RaisedButton 会显示异常,但不会使用 TextField .我不得不添加一个 try/catch 来打印异常,否则它是不可见的。
问题不是错误本身,问题是没有显示错误。请告诉我如何显示所有异常。

void main() => runApp(Test());

class Test extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          // EXCEPTION CAUGHT:
          // child: RaisedButton(child: Text('Test'), onPressed: () => throw Exception()),
          // EXCEPTION NOT CAUGHT:
          child: TextField(onSubmitted: (value) => throw Exception()),
        ),
      ),
    );
  }
}

最佳答案

这最终成为了一次有趣的狩猎。onSubmittedTextField 方法(以及 onFieldSubmittedTextFormField 方法)是从 performAction 基类的 EditableText 方法调用的,该方法最终作为平台 channel 消息(特别是“I”的消息)的结果调用我现在已完成编辑此文本字段”)。在 MethodChannel 类中,负责将事件传递给小部件的方法是 _handleAsMethodCall 方法:

Future<ByteData> _handleAsMethodCall(ByteData message, Future<dynamic> handler(MethodCall call)) async {
  final MethodCall call = codec.decodeMethodCall(message);
  try {
    return codec.encodeSuccessEnvelope(await handler(call));
  } on PlatformException catch (e) {
    return codec.encodeErrorEnvelope(
      code: e.code,
      message: e.message,
      details: e.details,
    );
  } on MissingPluginException {
    return null;
  } catch (e) {
    return codec.encodeErrorEnvelope(code: 'error', message: e.toString(), details: null);
  }
}
正如你所看到的,方法调用被包装在一个 try/catch 中,它吸收错误并将它们作为错误响应返回给平台,而不是让错误自然冒泡。这样做的结果是错误消息由内部 BinaryMessenger 处理,而不是由 Dart 本身处理。从那里它以 Window._respondToPlatformMessage 方法结束,这是一个本地绑定(bind)方法和一个调查死胡同(除非您了解 Flutter 特定于平台的本地实现)。
我不确定这是预期的行为还是错误,但无论哪种情况,结果似乎都是错误被平台/方法 channel 系统吸收。我正在 Flutter GitHub 页面上为此设计一个问题,并将在发布问题时使用链接更新此答案。
编辑:问题页面是 here

关于控制台中未显示 flutter 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63927404/

相关文章:

.NET - 异常记录和监控

android - Flutter开发(flutter-dev)›需要紧急帮助…由于gradle问题,我无法在android设备中运行flutter应用,并且无法构建apk

android - 如何为 Flutter 中使用 itemBuilder 生成的列表中的每个项目分配不同的键?

firebase - 在Flutter中从Firebase检索用户电子邮件

dart - 如何从 flutter 应用程序中删除 native 启动画面?

c++ - NULL 与抛出和性能

ios - Flutter IOS 使用连接或 wifi 插件读取 wifi 名称

flutter - 在 pubspec.yaml 的 flutter 中找不到图像文件

dart - Flutter - InputDecoration 边框仅在聚焦时

python - __init__ 方法中的异常处理