【问题标题】:How to throw an error and return a widget in the same time in a FutureBuilder如何在 FutureBuilder 中同时抛出错误并返回小部件
【发布时间】:2020-06-20 20:37:34
【问题描述】:

我使用Sentry 作为错误监控,捕获并存储我的 Flutter 应用程序中发生的所有错误。当我使用FutureBuilder 小部件时,我处理异步函数中的错误如下:

Widget build(context){
    return FutureBuilder(
        future: getData() // getting some data from an async function
        builder: (context, snap){
            if(snap.hasError){
                return Text('An error has occurred');
            }

            /// ...
            /// Doing something if there isn't an error
            /// ...
        }
    );
}

这里的问题是getData()中发生的错误没有显示在控制台或Sentry中,因为没有抛出错误。我尝试了以下方法:

Widget build(context){
    return FutureBuilder(
        future: getData() // getting some data from an async function
        builder: (context, snap){
            if(snap.hasError){
                thrown(snap.error); // this line was added
                return Text('An error has occurred');
            }

            /// ...
            /// Doing something if there isn't an error
            /// ...
        }
    );
}

在这种情况下,错误被抛出并且 Sentry 捕获它,但 Text() 小部件没有返回并且应用程序中没有显示任何内容。

我的问题是,是否有办法让 Sentry 捕获错误并返回一个小部件以在应用程序中显示某些内容。

【问题讨论】:

  • TL;DR Exceptions 只能用于特殊情况。在第一个代码块中,您的 .hasError 块正在处理错误,因此不会向控制台或 Sentry 报告错误。在第二个代码块中,您手动抛出一个错误(这是我假设您的函数 thrown() 正在执行的操作),因此控制权在该点返回。如果要显示Text,并向Sentry 报告,我会手动向Sentry 写入非致命错误消息,向控制台写入debugPrint,然后以正常方式继续处理。

标签: flutter


【解决方案1】:

TL;DR Exceptions 只能用于特殊情况。

在您的第一个代码块中,您的 .hasError 块正在处理错误,因此不会向控制台或 Sentry 报告异常。

在第二个代码块中,您手动抛出了一个错误(我假设您的函数 thrown() 正在执行此操作),因此控制涟漪从该点开始备份堆栈。

如果你想显示Text 小部件,同时也向 Sentry 报告,我会手动向 Sentry 写入非致命错误消息,向控制台写入 debugPrint 并以正常、优雅的方式继续我的处理方式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多