gpt4 book ai didi

控制台中未显示 flutter 异常

转载 作者:行者123 更新时间:2023-12-03 03:20:08 25 4
gpt4 key购买 nike

我正在尝试调试 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com