Flutter在Mac端调用OMDb API持续加载并报错的解决求助
解决Flutter在Mac上无法访问OMDb API的问题
针对你遇到的SocketException: Failed host lookup错误,以下是分步排查和解决方法:
1. 验证Mac网络连通性
- 直接在Mac浏览器访问
https://www.omdbapi.com,确认能否正常打开。如果打不开,说明是网络本身问题:- 切换DNS服务器(比如谷歌8.8.8.8或Cloudflare 1.1.1.1):打开系统设置→网络→高级→DNS,添加新的DNS地址。
- 终端执行
ping www.omdbapi.com,如果无响应,联系网络服务商或检查路由器设置。
2. 配置iOS/ macOS网络权限
- iOS模拟器/真机:在
ios/Runner/Info.plist中添加网络权限配置,绕过ATS限制:<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>omdbapi.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSAllowsArbitraryLoads</key> <true/> </dict> </dict> </dict> - Mac桌面应用:打开系统设置→网络→防火墙,检查是否拦截了你的Flutter应用,允许其网络访问权限。
3. 切换为HTTPS协议
你的代码使用HTTP协议,OMDb支持HTTPS,替换后可避免多数ATS和网络拦截问题:
final url = 'https://www.omdbapi.com/?apikey=$apiKey&s=movie&y=$currentYear&type=$type';
4. 重置Flutter项目缓存
终端执行以下命令清除缓存并重新依赖:
flutter clean flutter pub get
之后重启模拟器/应用,重新运行项目。
5. 检查代理设置
如果Mac开启了VPN或全局代理,可能导致域名解析失败:
- 暂时关闭代理,测试能否正常访问API。
- 若必须使用代理,确保代理规则允许访问
omdbapi.com。
代码优化建议(可选)
增加SocketException捕获,便于调试网络问题:
Future<List<dynamic>> fetchData(String type) async { const apiKey = 'MYKEY'; final currentYear = DateTime.now().year; final url = 'https://www.omdbapi.com/?apikey=$apiKey&s=movie&y=$currentYear&type=$type'; try { final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { final data = json.decode(response.body); if (data['Response'] == 'True') { return data['Search'] as List<dynamic>; } else { throw Exception(data['Error']); } } else { throw Exception('加载失败: 状态码 ${response.statusCode}'); } } on SocketException catch (e) { throw Exception('网络异常: ${e.message}'); } catch (e) { throw Exception('未知错误: $e'); } }
内容的提问来源于stack exchange,提问作者simonwyns
相关产品推荐
相关产品推荐

