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,但它没有。
cached_network_image的创建者说(来源):
如果启用了异常中断,调试器会停止,但这是因为 dart VM 并不总是知道是否捕获了异常。如果您继续这样做,仍然不会冻结您的应用程序。
这就是我需要的钥匙。这只是调试器停止了。您可以点击继续按钮或禁用在未捕获的异常时停止。然后小部件将按预期CachedNetworkImage显示。errorWidget
在 VS Code 中,您可以在调试面板的左下角取消选中此选项。
我相信基于这篇文章, Android studio 中也有类似的设置。