Flutter CachedNetworkImage 错误:(CacheManager:无法下载文件)和(SocketException 或 HttpException)

Sur*_*gch 5 http socketexception dart flutter

我正在使用cached_network_image库。如果我这样设置:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print('MyApp building');
    return MaterialApp(
      home: Scaffold(
        body: HomeWidget(),
      ),
    );
  }
}

class HomeWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        child: CachedNetworkImage(
          imageUrl: "https://example.com/image/whatever.png",
          placeholder: (context, url) => CircularProgressIndicator(),
          errorWidget: (context, url, error) => Icon(Icons.error),
       ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

使用无效的 URL(因为它返回 404 或服务器拒绝连接),然后我的 IDE 冻结并给出以下错误之一:

HttpExceptionWithStatus (HttpException: Invalid statusCode: 404, uri = https://example.com/image/whatever.png)
Run Code Online (Sandbox Code Playgroud)

或者这个(如果我把它改成一个不存在的主机):

SocketException (SocketException: Failed host lookup: 'ksdhfkajsdhfkashdfkadshfk.com' (OS Error: No address associated with hostname, errno = 7))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我希望CachedNetworkImage小部件只显示errorWidget,但它没有。

Sur*_*gch 4

cached_network_image的创建者说(来源):

如果启用了异常中断,调试器会停止,但这是因为 dart VM 并不总是知道是否捕获了异常。如果您继续这样做,仍然不会冻结您的应用程序。

这就是我需要的钥匙。这只是调试器停止了。您可以点击继续按钮或禁用在未捕获的异常时停止。然后小部件将按预期CachedNetworkImage显示。errorWidget

在 VS Code 中,您可以在调试面板的左下角取消选中此选项。

在此输入图像描述

在此输入图像描述

我相信基于这篇文章, Android studio 中也有类似的设置。

  • 这实际上并不能解决问题。我们希望库不要抛出错误,这样 IDE 就不会停止。在未捕获的异常上启用断点进行调试是很常见的,在这种情况下禁用它并不是一个解决方案。此外,如果您正在使用它,错误会传播到 crashlytics,这是完全不希望的。 (16认同)