【问题标题】:Disable Flutter's "red screen of death"禁用 Flutter 的“死机红屏”
【发布时间】:2018-12-23 13:16:17
【问题描述】:

有没有办法禁用 Flutter 的“死机红屏”? 在调试期间我不介意它,但它似乎也出现在生产版本中 - 我找不到任何关于如何禁用它的信息,或者我自己捕获错误。

我尝试用FlutterError.onErrorrunZoned(onError) 捕捉杂散错误,但两者都没有阻止红屏出现。

作为参考,我说的是这个屏幕:

【问题讨论】:

  • 您必须确保您的应用程序运行时没有错误,例如永远不要从 build 函数返回 null。
  • @boformer 好吧,这就是目标,是的 - 但某些错误不在我的控制范围内(例如,滚动侦听器在某些情况下失败),我仍然希望能够处理如果某些事情被忽略了,我会自己做一些事情。红屏死机是毫无意义的,因为它只会让用户感到困惑,而不是让我做类似警报之类的事情,并带有明确的消息,如“发生意外错误”。
  • 您可以编辑 Flutter 源代码以显示其他内容(例如空白屏幕)。代码在你的 Flutter 安装目录中。

标签: error-handling dart flutter


【解决方案1】:

您可以覆盖 ErrorWidget.builder 方法。
我解决了这个问题。

・示例代码。

void main() {
    ErrorWidget.builder = (FlutterErrorDetails details) => Container();
    ...
}

・默认代码

static ErrorWidgetBuilder builder = _defaultErrorWidgetBuilder;

希望对你有所帮助。


2019 年 12 月 21 日更新

或者更改 ErrorWidget backgroundColor 和 textStyle。

・示例代码

import 'dart:ui' as ui;
void main() {
    RenderErrorBox.backgroundColor = Colors.transparent;
    RenderErrorBox.textStyle = ui.TextStyle(color: Colors.transparent);
}

【讨论】:

  • 这不是和默认的一样吗?禁用将通过返回 Container() 而不是 ErrorWidget(details.exception);
  • 我相信这是我需要的,但我在哪里可以找到 ErrorWidgetBuilder.builder?
  • ErrorWidgetBuilder.builder 是静态的。请参阅此来源。 github.com/flutter/flutter/blob/…
  • 对不起。我的样品不好。请运行 void main() { ErrorWidget.builder = (FlutterErrorDetails details) => Container(); }
【解决方案2】:

您可以尝试使用 Catcher,它是一个免费的 Flutter 插件,可以捕获和处理 Flutter 应用程序中的错误。 Catcher 提供多种报告模式和处理程序来配合 Flutter 应用程序

只需在 pubspec.yaml 中添加捕手

catcher: ^0.1.2

有关捕手的更多信息 https://pub.dartlang.org/packages/catcher

捕手入门的不错教程https://medium.com/flutter-community/handling-flutter-errors-with-catcher-efce74397862

【讨论】:

    【解决方案3】:
    void main() {
     bool isDev = true;
              ErrorWidget.builder = (FlutterErrorDetails errorDetails) {
                return AppErrorWidget(
                  errorDetails: errorDetails,
                  isDev: isDev,
                );
              };
    }          
    
        class AppErrorWidget extends StatelessWidget {
          final FlutterErrorDetails errorDetails;
          final bool isDev;
          const AppErrorWidget({
            Key key,
            @required this.errorDetails,
            this.isDev = false,
          }) : super(key: key);
          @override
          Widget build(BuildContext context) {
            return Material(
              child: SafeArea(
                child: Container(
                  decoration: BoxDecoration(border: Border.all(color: Colors.red)),
                  child: ListView(
                    children: <Widget>[
                      Container(
                        height: 20,
                      ),
                      Text(isDev ? errorDetails.toString() : '')
                    ],
                  ),
                ),
              ),
            );
          }
        }
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。您可以使用edit 按钮改进此答案以获得更多选票和声誉!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2011-02-24
    • 2021-06-17
    • 2011-01-11
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多